NYOJ 239-月老的难题(二分图匹配)

55 篇文章 2 订阅

解的是标准的匈牙利算法的模板,网络流还没看,这题好像也可以用网络流解

匈牙利算法不懂的参考博客:  http://blog.csdn.net/niushuai666/article/details/7023101 

 /*
 qq:1239198605
 ctgu_yyf
        */

#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

int n,m;//人数,对数; 
vector<int>boy[520];//邻接表,保存匹配信息 
bool use[520];//标记数组,保存匹配信息 
int form[520];//父节点 (i号女生对应的男生编号) 

bool match(int cur) //匹配函数 
{
	for(int i=0;i<boy[cur].size();i++) //遍历所有能与cur男生匹配的女生 
	{
		if(!use[boy[cur].at(i)])     //判断该女生结点是否被判断过,没有进入 
		{
			use[boy[cur].at(i)]=1;   //将该女生标记为已经判断 
			if(form[boy[cur].at(i)]==-1||match(form[boy[cur].at(i)])) //如果该女生未被匹配,或者之前匹配该女生的男生可以匹配其他女生 
			{
				form[boy[cur].at(i)]=cur; //将该女生匹配给这个男生 
				return 1;                 //成功返回1 
			}
		}
	}
	return 0;
 } 


int hungary(){      //匈牙利算法 
	int count=0;    //计数器
	memset(form,-1,sizeof(form));  //保存女生对应的男生的编号,初始化为-1
	
	for(int i=1;i<=n;i++)    //遍历每个男生结点,与女生深搜匹配 
	{
		memset(use,0,sizeof(use)); //匹配前先将标记数组清零,其作用是防止重复搜索某节点 
		count+=match(i);
	 } 
	
	 return count;
	 
}


int main()
{
   ios::sync_with_stdio(false);
   int t;
   cin>>t;
   while(t--)
   {
   	cin>>n>>m;
   	for(int i=1;i<=n;i++)
   	boy[i].clear();
   	
   	int start,end;
   	for(int i=0;i<m;i++)
   	{
   		cin>>start>>end;
   		boy[start].push_back(end);
	   }
	   
	 int ans=hungary();
	 cout<<ans<<endl;  
	} 


return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值