匈牙利算法的正确性证明
匈牙利算法通过不断对当前匹配找增广路(交错轨),删去增广路上所有在当前匹配中的边,然后给当前匹配添加增广路上的其余边,就能使当前匹配数加一。一直重复这个操作,就能求出最大匹配。
证明用到两个引理。
引理一:假设当前匹配M所选的点集为V,那么一定存在一个最大匹配,其所选的点集是V的一个超集。
假设M已经是一个最大匹配,则已符合引理一。假设M不是最大匹配,那么任选一个最大匹配N,其所选的点集为U。
显然M中的每一条边,至少有一个端点在U中,因为如果两个端点都不在U中,那么给N加上这条边,就能得到一个更大的匹配,与N为最大匹配的假设不符。
那么对于M中的每条边,如果有一个端点a在U中,一个端点b不在U中,只需要先把N中a连的那条边删掉,再把ab加入N中即可。这个过程完成之后,U就成为了V的一个超集,同时N的匹配数也保持不变。引理一得证。
引理二:如果当前匹配M不是最大匹配,那么一定能找到一条增广路。
还是假设M所选的点集为V,根据引理一,一定有一个最大匹配N,其所选的点集U是V的一个超集。那么在N里面至少能找到一条边,使得边的两个端点至少有一个属于U和V的差集,从这条边开始,交错选择N和M中的边,选择方式如下:
- 每选择一条N里面的边,就要选择一条M里面的边。
- 如果上一条边为ab,那么下一条边就要选bc,也就是说相邻两次选择的边,要有一个点重合
- 直到所选