hdu1150Machine Schedule

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int m,n,k;
/*hdu1150 Machine Schedule
最小点覆盖=最大匹配数,把任务看做匹*/
int Link[202][202],vis[202],yM[202];
bool find_path(int u)//匈牙利算法
{
    for(int v=1;v<=m+n;v++)
    {
        if(!vis[v]&&Link[u][v])
		{
			vis[v]=1;
            if(yM[v]==-1||find_path(yM[v]))
            {
                 yM[v]=u;
                 return true;
            }
        }
    }
    return false;
}
int hungary()//匈牙利算法
{
	int ans=0;
    for(int i=1;i<=n+m;i++)
	{
		memset(vis,0,sizeof(vis));
		if(find_path(i))ans++;
	}
	return ans;
}
void init()
{
    memset(Link,0,sizeof(Link));
	memset(yM,-1,sizeof(yM));
}
int main()
{
	int a,b,c;
    while(cin>>n&&n)
	{
		init();
		cin>>m>>k;
		for(int i=0;i<k;i++)
		{
            scanf("%d%d%d",&c,&a,&b);
			Link[a][b+n]=1;
		}
	     cout<<hungary()<<endl;
	}
}
posted on 2011-06-29 22:40  4.5.6  阅读(155)  评论(0编辑  收藏  举报