nyoj 239 月老的难题 二分图最大匹配(匈牙利算法)

12 篇文章 0 订阅

如果对匈牙利算法不太懂的——请猛击

二分图最大匹配的第一题,主要是对增广路的理解,上面博客讲的很清楚,不再罗嗦,上代码——

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n;
vector<int> g[505];   //记录边
int mach[505],count;
bool flag[505];  
bool find(int x)
{
	int i;
	for(i=0;i<g[x].size();i++)
	{
		int k=g[x][i];
			if(!flag[k])
			{
				flag[k]=true;  //标记和x已经匹配过的点,避免重复匹配
				if(!mach[k]||find(mach[k]))  //mach[k]不为0,表示k已经和mach[k]匹配过了,如果能找到增广路,即find() 为真,则k可以重新匹配,此时匹配数加1
				{
					mach[k]=x;
					return true;
				}
			}
	}
	return false;
}
int main()
{
	int t,m,a,b,i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		for(i=1;i<=n;i++)
		  g[i].clear();
		   memset(mach,0,sizeof(mach));
		   count=0;
		while(m--)
		{
			scanf("%d%d",&a,&b);
			g[a].push_back(b);		
		}
		for(i=1;i<=n;i++)
		{
			memset(flag,false,sizeof(flag));//清空标记,上一个i匹配过的点,当前i还可以匹配
			if(find(i))
				count++;
		}
		printf("%d\n",count);
	}
	return 0;}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值