1. 程式人生 > 實用技巧 >二分圖最大匹配模板

二分圖最大匹配模板

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;
}