#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> using namespace std; #define maxn 1000 + 10 vector<int>G[maxn]; bool vis[maxn]; int link[maxn]; int n, m; bool Find(int u) { for(int i=0; i<G[u].size(); i++) { int &v = G[u][i]; if(!vis[v]) { vis[v] = true; if(link[v]==-1 || Find(link[v])) { link[v] = u; link[u] = v; return true; } } } return false; } void solve() { int ans = 0; for(int i=1; i<=n; i++) if(link[i]==-1)///这里需要加上判断 否则对已经匹配好的进行重新匹配,造成错误结果。 { memset(vis, 0, sizeof(vis)); if(Find(i)) ans++; } printf("%d\n", ans); } int main() { while(~scanf("%d%d", &n, &m)) { for(int i=1; i<=n; i++) G[i].clear(); memset(link, -1, sizeof(link)); for(int i=0; i<m; i++) { int r, c; scanf("%d%d", &r, &c); G[r].push_back(c + n); G[c+n].push_back(r); } solve(); } return 0; }
原文地址:http://blog.csdn.net/dojintian/article/details/45675187