【匈牙利算法】 二分图模板 poj 1274

时间:2023-03-09 07:03:34
【匈牙利算法】 二分图模板 poj 1274
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
int n,m,num,temp,sum;
int re[][],link[];//牛与牛栏的对应关系
bool tag[];//增益路径
bool DFS(int a)
{
for(int i=;i<=m;i++)
{
if(re[a][i]!= && !tag[i])//如果节点i与a相邻并且未被查找过
{
tag[i]=true;//标记i为已查找过
if(link[i]==-||DFS(link[i]))//i在匹配M中,但是从与i相邻的节点出发可以有增广路
{
link[i]=a;//记录查找成功记录
// cout << "sucess i=" << i << " link[i]= "<<link[i] <<endl;
return true;//返回查找成功
}
}
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>n>>m) // cow stall
{
int i,j,sum=;
memset(re,,sizeof(re));
memset(link,-,sizeof(link));
for(i=;i<=n;i++)
{
cin>>num;
for(j=;j<=num;j++)
{
cin>>temp;
re[i][temp]=;
}
}//初始化
for(i=;i<=n;i++) //cow
{
for(j=;j<=m;j++) //stall
{
tag[j]=false;
}
if(DFS(i))//从节点i尝试扩展
sum++;
}
cout << sum << endl;
}
return ;
}