二分圖最大匹配模板
阿新 • • 發佈:2020-08-06
#include<cstdio> #include<iostream> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int maxn = 505, maxe = 5e4+5; int n, m, e, tot=-1, fir[maxn], vis[maxn], match[maxn]; bool edgevis[maxn][maxn]; struct edge { int u, v, nxt; } g[maxe << 1]; edge addedge(int u, int v) { edge tmp; tmp.u = u; tmp.v = v; return tmp; } bool dfs(int x) { for(int i=fir[x]; i!=-1; i=g[i].nxt) { int y = g[i].v; if(vis[y]) continue; if(!match[y]) { match[y] = x; return 1; } else { vis[y] = 1; if(dfs(match[y])) { match[y] = x; return 1; } // vis[y] = 0; (加此句會導致無限迴圈) } } return 0; } signed main() { memset(fir, -1, sizeof(fir)); scanf("%d%d%d", &n, &m, &e); for(int i=1, a, b; i<=e; ++i) { scanf("%d%d", &a, &b); if(edgevis[a][b]) continue; edgevis[a][b] = 1; g[++tot] = addedge(a, b); g[tot].nxt = fir[g[tot].u]; fir[g[tot].u] = tot; } int ans = 0; for(int i=1; i<=n; ++i) { memset(vis, 0, sizeof(vis)); if(dfs(i)) ++ans; } printf("%d", ans); return 0; }