Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3836 Accepted Submission(s): 1797
/* ID: LinKArftc PROG: 2444.cpp LANG: C++ */ #include <map> #include <set> #include <cmath> #include <stack> #include <queue> #include <vector> #include <cstdio> #include <string> #include <utility> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 #define randin srand((unsigned int)time(NULL)) #define input freopen("input.txt","r",stdin) #define debug(s) cout << "s = " << s << endl; #define outstars cout << "*************" << endl; const double PI = acos(-1.0); const double e = exp(1.0); const int inf = 0x3f3f3f3f; const int INF = 0x7fffffff; typedef long long ll; const int maxn = 510; const int maxm = 250010; int mp[maxn][maxn]; int linker[maxn]; int id[maxn]; int uN, vN; int n, m; bool vis[maxn]; bool dfs(int x) { for (int i = 1; i <= n; i ++) { if (mp[x][i]) { if (id[i] == id[x]) return false; if (id[i] == 0) { id[i] = -1 * id[x]; if (!dfs(i)) return false; } } } return true; } bool dfs1(int u) { for (int v = 1; v <= n; v ++) { if (mp[u][v] && !vis[v]) { vis[v] = true; if (linker[v] == -1 || dfs1(linker[v])) {//刚开始这地方写成dfs了,罪过呀,写的有点混乱,下次注意! linker[v] = u; return true; } } } return false; } int hungry() { memset(linker, -1, sizeof(linker)); int ret = 0; for (int i = 1; i <= n; i ++) { memset(vis, 0, sizeof(vis)); if (dfs1(i)) ret ++; } return ret; } int main() { //input; int u, v; while (~scanf("%d %d", &n, &m)) { memset(mp, 0, sizeof(mp)); memset(id, 0, sizeof(id)); for (int i = 1; i <= m; i ++) { scanf("%d %d", &u, &v); mp[u][v] = 1; mp[v][u] = 1; } bool flag = true; for (int i = 1; i <= n; i ++) { if (!id[i]) { id[i] = 1; if (!dfs(i)) { flag = false; break; } } } if (!flag) { printf("No\n"); continue; } else printf("%d\n", hungry() / 2); } return 0; }
原文:http://www.cnblogs.com/LinKArftc/p/4908307.html