您的位置:首页 > 其它

二分图匈牙利算法

2010-11-06 19:54 218 查看
#include<stdio.h>
#include<string.h>
int n1,n2,m,ans;//n1代表集合1的顶点个数,n2,m边数,ans最大匹配数
int result[101];//记录V2中的点匹配的点的编号
bool state[101];//记录V2中的每个点是否被搜索过
bool data[101][101];//邻接矩阵 true代表有边相连
void init()
{
int t1,t2,i;
memset(data,false,sizeof(data));
memset(result,0,sizeof(result));
ans=0;
scanf("%d %d %d",&n1,&n2,&m);
for(i=1;i<=m;i++)
{
scanf("%d %d",&t1,&t2);
data[t1][t2]=true;
}
return;
}
bool find_p(int a)
{
int i;
for(i=1;i<=n2;i++)
{
if(data[a][i]==true && !state[i])//如果节点i与a相邻并且未被查找过
{
state[i]=true;
if(result[i]==0 || find_p(result[i]))//如果i未在前一个匹配M中 //i在匹配M中,但是从与i相邻的节点出发可以有增广路
{
result[i]=a;//记录查找成功记录
return true;//返回查找成功
}
}
}
return false;
}
int main()
{
freopen("in.txt","r",stdin);
init();
for(int i=1;i<=n1;i++)
{
memset(state,false,sizeof(state));
if(find_p(i))
ans++;
}
printf("%d/n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: