● 每周一言
量变引起质变,而这个量,或许是一些并不难的步骤。
导语
匈牙利算法由匈牙利数学家Edmonds在1965年提出,用于求解二分图的最大匹配问题。那么,什么是二分图最大匹配?匈牙利算法又是如何实现的?
匈牙利算法
依然从例子出发:现在有一个Gossip Girl式的小团体一共4男4女,男生分别标记为ABCD,女生则标记为abcd。看过绯闻女孩的都知道,在这部美剧里面,男女主演之间几乎都有一腿。为了让大家有个都不落单的完美结局,现需要给他们做一个最好的配对。已知:A与abc均有暧昧;B与ad有暧昧;C与cd有暧昧;而D只钟爱b(好样的!),只与b有爱暧昧。关系如下图所示:
这便是一个二分图。 所要求的最好配对方式,相当于在这张图的所有配对方式中,找出边数最多的配对。而这个配对,就是二分图最大匹配。
增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发点不算),则这条交替路称为增广路(agumenting path)。
匈牙利算法通过不断寻找当前二分图的增广路来更新配对方式,直到找不到增广路为止。针对上述例子,匈牙利算法的执行步骤如下图所示:
按ABCD的顺序分别匹配,先配A和B。黄色代表当前找到的增广路,绿色代表当前的配对。首先,图(1)找到增广路A→a,图(2)将增广路中的Aa配对;然后,图(3)找到增广路B→a→A→b,图(4)将增广路中的Ba、Ab分别配对。 这里可以看出,由于二分图的性质,增广路中每隔一条边配一条边,总能保证配对最大且无误。
接着配C和D。首先,图(5)找到增广路C→c,图(6)将增广路中的Cc配对;然后,图(7)找到增广路D→b→A→a→B→d,图(8)将增广路中的Db、Aa、Bd分别配对。至此,图中已再无增广路,算法结束。
可知每次找增广路的时候,最差情况下将遍历所有边。因此匈牙利算法的时间复杂度为O(nm),其中n表示二分图半边的点数,m表示二分图的总边数。敬请期待下节内容 平衡树。
结语
感谢各位的耐心阅读,后续文章于每周日奉上,欢迎大家关注小斗公众号 对半独白!