#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
int map[111][111];
int n,m,k;
int link[111];
int visit[111];
bool dfs(int k)//寻找从k出发的可增广路
{
int i,j;
for(int i=1;i<=m;i++)
{
if(map[k][i]&&!visit[i])
{
visit[i]=1;//加入增广路
j=link[i];
if(j==-1||dfs(j))//j是未盖点 或者 从j的对应项出发有可增广路)
{
link[i]=k;
return true;//k有可增广路,返回true;
}
}
}
return false;//则从k没有可增广路,返回false;
}
int hungary()
{
int num=0;
memset(link,-1,sizeof(link));//初始化
for(int i=1;i<=n;i++)
{
memset(visit,0,sizeof(visit));
if(dfs(i))//有增广路
{
num++;//匹配数++
}
}
return num;
}
int main()
{
int num,x,y;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
break;
}
scanf("%d%d",&m,&k);
memset(map,0,sizeof(map));
for(int i=0;i<k;i++)
{
scanf("%d%d%d",&num,&x,&y);
map[x][y]=1;
}
int ans=hungary();
printf("%d\n",ans);
}
return 0;
}
POJ-1325 && HDU-1150 Machine Schedule 二分图匹配
最新推荐文章于 2018-08-09 20:48:18 发布