二分图匹配----匈牙利算法之一

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

  

posted on 2011-07-19 21:32  sysu_mjc  阅读(150)  评论(0编辑  收藏  举报

导航