匈牙利算法

会有一股神秘感。 提交于 2019-12-13 10:37:29

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

概述

在二分图中寻找最大匹配数的算法(如对二分图不熟悉,可以看下笔者的另一篇文章二分图/二部图检测(动图&代码实现)),即对一侧的每一个尚未匹配的顶点,不断寻找可以增广的交替路

  • 交替路: 匹配边和非匹配边交替出现
  • 增广路径: 从一侧的非匹配点终止于另一个非匹配点

匈牙利算法

思路

  • 从左侧的一个非匹配点出发
  • 从右向左的边,永远走匹配边
  • 终止于另一个非匹配点,则有增广路径,最大匹配数加1 补充:左侧和右侧只是一种说法,等价于一侧和另一侧

二分图寻找最大匹配数

下图是一个二分图,将会通过给这个图寻找最大匹配数,来描述匈牙利算法寻找增广交替路的思路 在这里插入图片描述补充:匹配后的点置为红色,匹配边也置为红色

  • 从顶点0出发,到达顶点4,此时顶点0和顶点4都是非匹配点,则找到一条增广交替路,最大匹配数为1 在这里插入图片描述
  • 从顶点1出发,从右->左的边只走匹配边,所以走1->4->0,此时来到顶点0,还可以走到顶点6,顶点6又是一个非匹配点,则找到一条增广的交替路,将该交替路中的匹配路变为非匹配路,非匹配路变为匹配路,并将顶点1和顶点6置为匹配点 在这里插入图片描述
  • 此时的最大匹配数为2 在这里插入图片描述
  • 从顶点2出发,依次走过:2->6->0->4->1->5,找到一条新的增广交替路,再进行一次变换,并将顶点2和顶点3置为匹配点 在这里插入图片描述
  • 此时的最大匹配数为3 在这里插入图片描述
  • 至此,所有的顶点都匹配到了,最大匹配数为3
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!