您的位置:首页 > Web前端

POJ 1274The Perfect Stall (二分图最大匹配问题,匈牙利算法实现)

2011-03-09 22:14 363 查看
还是牛的问题,用最大流实现过,但当时看到人家匈牙利算法,按照二分图的最大匹配问题处理的,代码好短啊……

所以决心研习下,看了看,其实不复杂,在注释里有解释,看代码吧

#include<iostream>
using namespace std;
#define N 201
int n,m,map

,match
,vis
;
//match[]保存牛栏匹配的牛的编号
void getmap()
{
int num,x;
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++)
{
scanf("%d",&num);
while(num--)
{
scanf("%d",&x);
map[i][x]=1;
}
}
}
int dfs(int a)
{
for(int i=1;i<=m;i++)
{
if(map[a][i] && !vis[i])
{
vis[i]=1;
if( match[i]==-1 || dfs(match[i]) )
//第i个栏还没有被占(是空的),或者占据该栏的牛可以找到其他栏
{
match[i]=a;
return 1;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
getmap();
int cnt=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if( dfs(i) ) cnt++;
}
printf("%d/n",cnt);
}
return 0;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法