Solved:4
rank:268
C. Dynamic Graph Matching 状压DP一下
#include <stdio.h> #include <algorithm> #include <algorithm> #include <string.h> using namespace std; typedef long long ll; const ll mod = 1e9 + 7; ll dp[1 << 10]; ll ans[7]; int num[1 << 10]; void work() { int len = 1 << 10; for(int i = 1; i < len; i++) { int x = i; while(x) { if(x & 1) num[i]++; x >>= 1; } } } int main() { work(); int T; scanf("%d", &T); while(T--) { int n, m; scanf("%d%d", &n, &m); memset(dp, 0, sizeof(dp)); memset(ans, 0, sizeof(ans)); dp[0] = 1; char s[5]; int len = 1 << n; for(int i = 1; i <= m; i++) { int a, b; scanf("%s", s); scanf("%d%d", &a, &b); a--, b--; int tmp = (1 << a) | (1 << b); for(int i = 1; i < len; i++) { if(num[i] & 1) continue; if((i & tmp) == tmp) { if(s[0] == '+') { dp[i] = (dp[i] + dp[i - tmp]) % mod; ans[num[i] / 2] += dp[i - tmp]; ans[num[i] / 2] %= mod; } else { dp[i] -= dp[i - tmp]; dp[i] = (dp[i] + mod) % mod; ans[num[i] / 2] -= dp[i - tmp]; ans[num[i] / 2] += mod; ans[num[i] / 2] %= mod; } } } for(int i = 1; i <= n / 2; i++) { if(i == 1) printf("%d", ans[i]); else printf(" %d", ans[i]); } puts(""); } } return 0; }