匈牙利算法

匈牙利算法

众所周知,匈牙利算法是一种算法
第一次接触匈牙利算法是在一次模拟赛中的第三题导弹,这道题要A国一些点负责一个必过的点,这种情况下我们要最优,但单纯判断有无重复是不行的,因为一个点最优(贪心)不代表全局最优,所以我们要先用二分枚举答案,再用匈牙利算法来验证
讲了那么多其实匈牙利算法就是给出两类东西(一类>=二类),第一类东西都有自己可以接受的第二类(但只能选一个),看第二类是否都能被选到
下图为图文结合,更加简洁易懂
首先下列各线表达的是一类可以接受的二 (繁体) 类,如图所示
在这里插入图片描述
然后最秀的一开始,很显然,壹没人要,直接带走
在这里插入图片描述
然后二找到了贰,也是直接带走
在这里插入图片描述
然后三想找壹,一看在他挺可怜的,就让给了他
在这里插入图片描述
然后一去抢贰,二身为巨佬,十分大方地让给了他
在这里插入图片描述
然后二找到了肆
在这里插入图片描述
然后四找到了叁
在这里插入图片描述
然后五想抢叁,但若要给他,四就没人了(三选了壹,一就只能选贰,二就只能选肆,所以,四不能选肆)
在这里插入图片描述
所以结果是二类全被要到了,而一类只有五没要到
在这里插入图片描述
SO,这就是匈牙利算法的过程

代码实现:

bool js(int xx)//第xx个一类
{
	int l=0;//用于记录
	for (int i=head[xx];i;i=f[i].next)//枚举xx与xx可以接受的每一个二类之间线
	  if (!pd[f[i].to])//可以诚恳地向他要
	  {
	  	l=bg[f[i].to];//记录下原主人
	  	bg[f[i].to]=xx;//暂时要过来
	  	pd[f[i].to]=true;//防止原主人又过来要,然后造成死循环
	  	if ((!l)||(js(l))) return true;//要不本来没人要,要不原主人找到别的二类了
	  	bg[f[i].to]=l;//没法要这个就还给他
	  }
	return false;//全程下来还没找到就是“凉”了
}

这里个是先枚举每一个一类再来判断他要到没有,还要在每一回清空pd数组

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值