匈牙利算法自主总结
Posted xmex
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匈牙利算法自主总结相关的知识,希望对你有一定的参考价值。
看原理之前我们先来了解——匈牙利概念
在我们理解概念之后,我们知道这是一个优化时间的算法
至于原理是什么我们现在来讲(以下图片由一只秀逗提供)
首先我们先来放一张男女找伴侣的图
是不是有种鲜花插在牛粪上的感脚
我们看他们相互的连线,所连的线表示男生对某个女生有好感
那么我们男生按编号从小到大来找对象
很显然1——>1 2——>2,但是到3号的时候发现跟一号是情敌
那怎么办呢?我们假设三号抢的过一号那么一号女生让给了三号
还好一号还喜欢二号女生,那么我们把二号女生给一号
但是之前二号男生喜欢二号女生,那么只能受委屈
喜欢另一个目标——三号女生
这样前三位男生就不再冲突了
就是这种情况(蓝线表示两两相对关系)
那么,我们只能恭喜四号男生找到了最漂亮的女生
其实这种找对象方法是一个递归的过程
那么匈牙利算法就是这种原理——有条件就上,没条件就创造条件上
那么我们来看匈牙利算法的板子
bool find(int x){ int i,j; for (j=1;j<=m;j++){ //扫描每个妹子 if (line[x][j]==true && used[j]==false) //如果有暧昧并且还没有标记过(这里标记的意思是这次查找曾试图改变过该妹子的归属问题,但是没有成功,所以就不用瞎费工夫了) { used[j]=1; if (girl[j]==0 || find(girl[j])) { //名花无主或者能腾出个位置来,这里使用递归 girl[j]=x; return true; } } } return false; }
主程序是这样的
for (i=1;i<=n;i++) { memset(used,0,sizeof(used)); //这个在每一步中清空 if find(i) all+=1; }
我们现在就可以做题啦
推荐一道水题——luogu P2071
再次感谢一只秀逗提供思路
以上是关于匈牙利算法自主总结的主要内容,如果未能解决你的问题,请参考以下文章