P3386 【模板】二分图最大匹配
#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;
}