模板-二分图匹配(匈牙利算法)

短小精悍的一个算法,提出者是匈牙利著名数学家Edmonds.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

#include <cstdio>
#include <cstring>

using namespace std;
const int maxn=1010;
bool flag[maxn][maxn],vis[maxn];
int match[maxn];
int m,n,e,ans;
inline bool (int cur){
for(int i=1;i<=m;i++){
if(flag[cur][i] && !vis[i]){
vis[i]=1;
if(!match[i] || dfs(match[i])){
match[i]=cur;
return 1;
}
}
}
return 0;
}
int main(){
scanf("%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++){
int a,b;
scanf("%d%d",&a,&b);
if(a<=n && b<=m) flag[a][b]=true;
}
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%dn",ans);
return 0;
}