hdu 2063 给男女匹配 (匈牙利算法)

来源:http://acm.hdu.edu.cn/showproblem.php?pid=2063 

题意:

有k个组合a,b组合,代表a愿意与b坐过山车,共m个女生 n个男生,问有多少个满意的匹配

题解:

这是一道匈牙利算法的裸题,用递归询问是否能安排好某个女生,如果能就ans++

注意,在同一回合的询问中,某个女生只寻找一次其它男生,第二次寻找时一定无法找到,直接返回0就行

这是我第二次做这道题,在前几个月已经做过,没想到这就是传说中的二分图  Orz

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 500+5;

int part[maxn];
bool vi[maxn];
int n,m,k;

vector<int>ma[maxn];

bool is_ok(int x)
{
	 if(vi[x]==0)vi[x]=1;
	 else return 0;
     for(int i=0;i<ma[x].size();i++)
	 {
          if(part[ma[x][i]]==0||is_ok(part[ma[x][i]]))
		  {
			  part[ma[x][i]]=x;
			  return 1;
		  }
	 }
	 return 0;
}

int main()
{
    while(scanf("%d",&k)!=EOF)
	{
		  if(k==0)break;
		  scanf("%d %d",&m,&n);
		  int ans=0;
		  for(int i=1;i<maxn;i++)
		  {
			  ma[i].clear();
			  part[i]=0;
		  }
  	      for(int i=1;i<=k;i++)
		  {
			  int a,b;
 			   scanf("%d %d",&a,&b);
			   ma[a].push_back(b);
		  }
		  for(int i=1;i<=m;i++)
		  {
			   for(int j=1;j<=m;j++)vi[j]=0;
               if(is_ok(i))
      			   ans++;
		  }
		  printf("%d\n",ans);
	}
	return 0;
}

  

posted @ 2018-05-23 21:17  czh~  阅读(310)  评论(0编辑  收藏  举报