HDU2444 二分图判断(BFS 的染色法) + 求最大匹配边数(DFS 的匈牙利算法)

本文介绍了如何使用染色法判断一个图是否为二分图,并详细阐述了匈牙利算法求解最大匹配数的过程。通过示例解释了如何在二分图中寻找增广路径来增加匹配数,同时提供了相关问题的实例和解决方案。
摘要由CSDN通过智能技术生成

0)二分图匹配有两种算法,一种是网络流中的最大流,另一种就是下面的匈牙利算法。


①用染色法判断是否是二分图:

   主要是怎么判断一个图是不是二分图。不妨选取某个点作为起点并染为某种颜色、同时把与它相邻的元素染为对立的颜色,进行BFS(DFS也可以),如果到某一步发现当前点和相邻点的颜色一样,那么就出现了矛盾,就不是二分图。


②匈牙利算法求最大匹配数


I原理:

    通过DFS或者BFS进行遍历,遇到新的未匹配的点或者有增广路(若有增广路就可以反转,则最大匹配数就可以+1)的出现,便返回TRUE使当前最大匹配数+1,然后继续遍历,直到完成遍历或者已找出最大匹配数。


II情景理解:

    在这个用于理解的示例中,为了描述方便,采用line[i][j]二维数组描述boy[i]与girl[j]之间是否互相喜欢,boy最多有n个,girl最多有m个,现在求怎样搭配他们,让他们成为情侣的对数最多。

【下面的例子中,是男生主动向女生告白、挑选女生,换成女生主动向男生告白、挑选男生一样啦。】

find函数:

bool find(int x){
	int i,j;
	for (j=1;j<=m;j++){    //扫描每个妹子
		if (line[x][j]==true && used[j]==false)      
		//如果互相喜欢并且第x号男生还没有向这个妹子表白过,就尝试表白
		{
			used[j]=1;//不论是否成功,先做标记,该男生对这个妹子表白过(如果这个男生表白成功,used数组自然全部清零,假如对第j个女生没有表白成功,说明第j个女生一定是名花有主而且他的现男友找不到新的女人去代替第j个女生做他的新女友,所以该男生每表白一个女生不论成功与否,接下来被表白的女孩子的现男友都没有必要再去向这些女孩尝试表白了)
			if (girl[j]==0 || find(girl[j])) { 
				//该女生目前还没有男朋友 或者 第x号男生决定与这个女生的现任男朋友谈一谈问问他可不可以换个女生把这个让给自己如果成功就返回1
				girl[j]=x;//这个女生的现任男朋友变成了第x号男生,存储一下,因为女孩子都比较马虎,不记一下可能会忘记...
				return true;//牵手成功返回1
			}
		}
	}
	return false;//牵手失败、没有与任何一个女生确定恋爱关系,返回0
}

主函数:

for (i=1;i<=n;i++)                      //我们鼓励每一个男生依次向自己喜欢的女生表白,且先不管那个女生是否有男朋友...
{
	memset(used,0,sizeof(used));    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值