在图论中,匹配是指两两没有公共点的边集。
最大匹配即为包含边数尽量多的边集。
匈牙利算法主要流程是不断地寻找增广路进行增广。时间复杂度O(NM)。
当然,这个问题也可以用网络流来求解。假设两个点集分别为A和B,S向A连流量为1的边,A向B在原边集的基础上连流量为1的边,B向T连流量为1的边。跑S到T的最大流即为最大匹配边集中的边数。
由A连向B的边中,残量为0的边即为匹配边。
上述算法用Dinic实现的复杂度为O(N^0.5M)。
所以匈牙利算法不如dinic快;
匈牙利算法看代码一看明了忘不了;
定义一个点能够覆盖以之为端点的所有边。
定义点覆盖为覆盖图所有边的点集。
最小点覆盖即为包含点数尽量少的点集。
二分图的最大匹配集合数值上等于最小点覆盖的大小。
用网络流求解时,假设S-T割把原图分成两个连通块S集和T集,那么(B∩S)∪(A∩T)即为一个最小点覆盖。
为什么最大匹配=最小点覆盖;
因为如果
最大匹配<最小点覆盖
简单来说,就是一个点必定覆盖1个匹配,这个自己脑补把;
独立集是两两没有公共边的点集。
最大独立集即为点数尽量多的独立集。
二分图的最大独立集等于二分图最小点覆盖关于全点集的补集。
这个也比较显然把;