您的位置:首页 > 其它

POJ1274(匈牙利算法)

2015-01-19 21:59 155 查看
找二分图最大匹配

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;

int edge[205][205];
int used[205];
int belong[205];
int n,m;
bool findpath(int x)
{
int i;
for (i=1;i<=m;i++)
{
if (edge[x][i] && !used[i])
{
used[i]=1;
//当一个节点没有被占用 或者 占用该节点的节点可以“挪动”指向其它节点
if (belong[i]==0 || findpath(belong[i]) )
{
belong[i]=x;
return true;
}
}
}
return false;
}

int main()
{
int i,j;
while (scanf("%d",&n)!=EOF)
{
memset(belong,0,sizeof(belong));
memset(edge,0,sizeof(edge));
scanf("%d",&m);
for (i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
for (j=0;j<x;j++)
{
int y;
scanf("%d",&y);
edge[i][y]=1;
}
}
int ans=0;
for (i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if (findpath(i))
ans++;
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: