二分图匹配----匈牙利算法之一
#include<iostream> //二部图匹配--匈牙利算法
#include<cstring>
using namespace std;
int n1,n2,m;
int result[101]; //result记录V2中的点匹配的点的编号
int edge[101][101],vis[101]; //vis记录V2中的每个点是否被搜索过
bool find(int a)
{
for(int i=1;i<=n2;++i)
{
if(edge[a][i]==1&&vis[i]==0) //如果节点i与a相邻并且未被查找过
{
vis[i]=1; //标记i为已查找过
if( result[i]==0 || find(result[i])==true ) //如果i未在前一个匹配M中或者 i在匹配M中,但是从与i相邻的节点出发可以有增广路
{
result[i]=a; //记录查找成功记录
return true; //返回查找成功
}
}
}
return false;
}
int main()
{
memset(edge,0,sizeof(edge));
memset(result,0,sizeof(result));
scanf("%d%d%d",&n1,&n2,&m);
int t1,t2;
while(m--)
{
scanf("%d%d",&t1,&t2);
edge[t1][t2]=1;
}
int ans=0;
for(int i=1;i<=n1;++i)
{
memset(vis,0,sizeof(vis)); //清空上次搜索时的标记
if(find(i)==true) //从节点i尝试扩展
ans++;
}
printf("%d\n",ans);
return 0;
}