参考
匈牙利算法可以用来解决在二分图中最大匹配的问题。这里参考了几位大佬的博客。代码主要是参考Renfei Song大佬的。
Renfei Song’s Blog – 二分图的最大匹配、完美匹配和匈牙利算法
zxfx100 – Hungary
willinglive –【hall定理】一个关于二分图的问题
神犇(shenben) – 匈牙利算法(二分图)
DarkScope从这里开始 – 趣写算法系列之–匈牙利算法7
二分图中的匹配
这里有几个概念先要列一下, 当然我这里就是通俗的解释一下,精确的定义可以看Renfei Song DA LAO’s Blog
- 二分图–大概就是一个图里面节点分成两个部分V1和V2,且只存在V1与V2之间的边。
- 二分图匹配–通俗一点理解就是,V1,V2的点,配成一对对的。
- 最大匹配–就是最大的匹配,能配出最多对。
- 完美匹配–所有的点都可以找到另一半,(当然这个就是可遇不可求了。
- 交替路–假设我们在途中已经找到了一组匹配,那么从一个非匹配点钟出发依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。
- 增广路径–从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)。这里直接截的图,图 5 中的一条增广路如图 6 所示(图中的匹配点均用红色标出):
如果在二分图中能找到一条增广路径,那么我们把增广路径中匹配边和非匹配边互换一下就可以增加一个匹配了。这就是匈牙利算法的基本思想。
匈牙利算法
匈牙利算法基本思想就是遍历整个图,然后找出所有的增广路径,找出一条就说明匹配可以加一。找出所有的就可以了。
图的遍历有两种方式,深度优先DFS 和广度优先BFS。复杂度都是O(V*E),DFS用递归比