二分图最大匹配
匈牙利算法模板
一个mat数组记录匹配的对象 一个flag数组记录对于当前点是否已经匹配
flag数组记得每次清空 至于函数部分有个递归的过程
//二分图最大匹配KM算法
/*
8 5 5
1 1
1 2
2 1
2 2
3 3
4 3
4 5
5 5
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int n,m;
int mp[1000][1000],flag[1000],mat[1000];
int km(int x){
for(int i=1;i<=m;i++)
{
if(mp[x][i]&&!flag[i]){
flag[i]=1;
if(!mat[i]||km(mat[i])){
mat[i]=x;
return 1;
}
}
}
return 0;
}
int main(){
int p,x,y;
scanf("%d%d%d",&p,&n,&m);
for(int i=1;i<=p;i++)
{
scanf("%d%d",&x,&y);
mp[x][y]=1;
}
int sum=0;
for(int i=1;i<=n;i++)
{
memset(flag,0,sizeof(flag));
if(km(i)) sum++;
}
printf("%d\n",sum);
return 0;
}