匈牙利算法 核心
1.首先从任意一个未被配对的点u开始,从点u的边中任意选一条边开始配对,如果此时点v还没有配对,那么配对成功,此时便找到了一条增广路,如果此时点v已经配对,尝试进行“连锁反应”,如果尝试成功了,则找到了一条增广路,此时需要更新原来的配对关系,这里用一个match数组记录配对关系,比如u和v配对了,记作match[v]=u。配对成功后,把配对数加1,配对的过程使用深度优先搜索实现(dfs)当然广度优先搜索(bfs)也行;
2.如果刚才所选的边配对失败,从点u的边中再选一条边,进行尝试,直到点u配对成功,或者尝试点u所有的边为止
3.接下来对剩下的没有被配对的点一一进行配对,直到所有的点都尝试完毕,找不到新的增广路为止
4.输出配对数。
》》》》是不是很挠头??
来来来,举个栗子就好懂啦:
男1 2 3 号,女1 2 3 号 去做过山车。可是,过山车的每一排只有两个座位,为了安全起见,每个女生必须与一名男生同坐。但是,每个女孩都希望和自己认识的人一组,女1只认识男1和男2,女2认识男2和男3,女3认识男1,你可以帮忙算算哪种组合可以坐上过山车吗?
我们可以这么想,首先从左边的第1号女生开始考虑。先让她与1号男生配对,配对成功后,紧接着考虑2号女生。2号女生可以与2号男生配对,接下来继续考虑3号女生。此时我们发现3号女生只能和1号男生配对,可是1号男生已经配给1号女生了,怎么办?
此时3号女生硬着头皮走到了1号男生面前,貌似1号男生已经看出了3号女生的来意,这个时候1号男生对3号女生说:“我之前已经答应了与1号女生坐一起,你稍等一下,我让号女生去问问看她能否与其他认识的男生坐一起,如果她找到了别的男生,那我就和你坐一起。”接下来,1号女生便尝试去找别的男生啦。
此时1号女生来到了2号男生面前问:“我可以和你坐在一起吗?”2号男生说:“我刚答应和2号女生坐一起,你稍等一下,我让2号女生去问问看她能否与其他认识的男生坐起,如果她找到了别的男生,那我就和你坐一起。”接下来,2号女生又去尝试找别的男生啦。此时,2号女生来到了3号男生面前问:“我可以和你坐一起吗?”3号男生说:“我正 空着呢,当然可以啦!”此时2号女生回过头对2号男生说:“我和别的人坐在一起啦。”然 后2号男生对1号女生说:“现在我可以和你坐在一起啦。”接着,1号女生又对1号男生说 “我找到别的男生啦。”最后1号男生回复了3号女生:“我现在可以和你坐在一起啦。”
最终的结果就是:
来看看代码吧。。。为撒csdn代码太多会出现乱码啊。。。。