HDU2063(匈牙利算法)

不断寻找增广路,每找到一条增广路,匹配数加1

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int m,bn,gn;
vector<int> vec[510];
bool b[510];	//记录v2的点是否被访问过
int lk[510];	//记录v2匹配的点
bool find(int cur)
{
	for(vector<int>::iterator it=vec[cur].begin();it!=vec[cur].end();it++)
	{
		if(b[*it]) continue;
		b[*it]=1;
		if(!lk[*it]||find(lk[*it]))
		{
			lk[*it]=cur;
			return 1;
		}
	}
	return 0;
}
int main()
{
	while(scanf(" %d",&m),m)
	{
		memset(lk,0,sizeof(lk));
		scanf(" %d %d",&gn,&bn);
		for(int i=1;i<=gn;++i)
			vec[i].clear();
		int bi,gi;
		for(int i=0;i<m;++i)
		{
			scanf(" %d %d",&gi,&bi);
			vec[gi].push_back(bi);
		}
		int ans=0;
		for(int i=1;i<=gn;++i)
		{
			memset(b,0,sizeof(b));
			if(find(i)) ++ans;
		}
		printf("%d\n",ans);
	}
}


posted @ 2014-10-16 12:28  Netop  阅读(197)  评论(0编辑  收藏  举报