hdu过山车——二分图匹配之匈牙利算法模板题

题目链接

思路

二分图匹配模板题

AC代码

#include<bits/stdc++.h>

using  namespace std;
const int N = 520;
int g[N][N],used[N];//邻接矩阵存图,g[u][v]=1说明u到v有一条路
int k,m,n;//分别表示可能的组合数目,女生的人数,男生的人数
int match[N];//match[i]= x:表示男生i与女生x配对 
int found(int x)//看女生x能否找到和自己搭档的男生 
{
    
    

	//从自己喜欢的男生里面去找 
	for(int i=1; i<=n; i++)
	{
    
    
		//如果女生x愿意和男生i做搭档,并且女生x还没有
		//找过男生i 
		if(g[x][i]&&!used[i])
		{
    
    
			//那么女生x尝试找男生i 
			used[i] = 1;
			//如果男生i还没有女搭档,或者,男生i的
			//女搭档还可以找到另外的女生做搭档 
			if(!match[i]||found(match[i]))
			{
    
    
				match[i] = x;
				return 1; 
			} 
		} 
	}
	return 0;
}
int main()
{
    
    

    while(cin>>k&&k)
   {
    
    
   	//由于是多组输入,记得每次初始化 
	memset(g,0,sizeof g);
	memset(match,0,sizeof match);
    scanf("%d%d",&m,&n);
	while(k--)
	{
    
    
		int u,v;
		scanf("%d%d",&u,&v);
	    g[u][v] = 1;
	}
	int ans = 0;
	//注意这里是1~m,枚举每一个女生能否找到男伙伴 
	for(int i=1; i<=m; i++){
    
    
		memset(used,0, sizeof used);
		if(found(i)) ans++; 
	}
	cout<<ans<<endl; 
   }

	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_45769627/article/details/112670191