您的位置:首页 > 其它

POJ3041 二分图最小点覆盖(匈牙利算法)

2017-08-22 21:04 344 查看



#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=600;
bool line[maxn][maxn],used[maxn];
int target[maxn],c,r,n,m,all;
bool found(int x)
{
int i,j;
for(j=1;j<=c;j++)
{
if(line[x][j]==true&&used[j]==false)
{
used[j]=true;
if(target[j]==0||found(target[j]))
{
target[j]=x;
return true;
}
}
}
return false;
}

int main()
{
while(scanf("%d%d",&c,&r)!=EOF)
{
memset(line,false,sizeof(line));
memset(target,0,sizeof(target));
all=0;
for(int i=1;i<=r;i++)
{
scanf("%d%d",&n,&m);
line
[m]=true;
}
for(int i=1;i<=c;i++)
{
memset(used,false,sizeof(used));
if(found(i))
{all+=1;}
}
printf("%d\n",all);
}
return 0;
}///直接将x y看成两个结点。二分图:最大匹配数=最小定点覆盖
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐