Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
专注于写DFS,竟忽略了背包循环的顺序……#include<cmath> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; /* POJ 1636 */ const int N = 1005; int n, m; bool dp[N][N]; bool vis[2][N]; vector<int> G[2][N]; pair<int, int> dfs(int p, int u) { //cout << "DFS " << p << " " << u << endl; pair<int, int> res = make_pair(p, p ^ 1); vis[p][u] = true; for (register int i = 0; i < G[p][u].size(); i++) if (!vis[p ^ 1][G[p][u][i]]) { pair<int, int> v = dfs(p ^ 1, G[p][u][i]); res.first += v.first, res.second += v.second; } return res; } signed main(void) { register int cas; scanf("%d", &cas); while (cas--) { scanf("%d%d", &n, &m); memset(dp, 0, sizeof(dp)); memset(vis, 0, sizeof(vis)); dp[0][0] = true; for (register int i = 0; i <= n; i++) G[0][i].clear(), G[1][i].clear(); for (register int i = 1; i <= m; i++) { register int x, y; scanf("%d%d", &x, &y); G[0][x].push_back(y); G[1][y].push_back(x); } for (register int t = 0; t < 2; t++) for (register int i = 1; i <= n; i++) if (!vis[t][i]) { pair<int, int> tmp = dfs(t, i); //printf("tmp %d %d\n", tmp.first, tmp.second); for (register int j = n / 2; j >= tmp.first; j--) for (register int k = n / 2; k >= tmp.second; k--) dp[j][k] |= dp[j - tmp.first][k - tmp.second]; } register int ans = 0; for (register int i = 1; i <= n / 2; i++) if (dp[i][i])ans = i; printf("%d\n", ans); } #ifndef ONLINE_JUDGE system("pause"); #endif // !ONLINE_JUDGE } /* * 注意其中做背包的时候,j和k应当从大向小枚举哦! * 千万不要因为专注于“复杂”的DFS而忽视了基础的DP。 */ Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator