老年选手不记得怎么输出方案了…
其实就是复习一波König定理
首先我们知道:最小点覆盖(N)=最大匹配数(M)
下面给出证明
N<M
在匹配边之间,显然不存在相同的顶点
因此,想覆盖每一条匹配边,则至少需要M个顶点
矛盾
N>M
如果我们可以给出一个方案使得N=M
那么显然这个情况就不用讨论了
N=M
我们尝试使用我们构造出的最大匹配方案来进行最小点覆盖
过程其实很简单,从每一个右边未匹配的节点出发,类似于匈牙利算法地走
也就是走一条非匹配边再走一条匹配边
然后将沿路所有的节点标记
最后左边标记的节点和右边未被标记的节点即使最小点覆盖
下文将这些点为选出的点
我们选了几个点?
首先,我们选择的都是匹配边上的点
通过走的方式,我们可以发现我们的路径是未匹配点(右)—>匹配点(左)—>未匹配点(右)—>匹配点(左)—>…未匹配点(右)
因此左端有标记的都是匹配点
右端没有标记的显然都是未匹配点
而一条匹配边显然不可能只有一个点被标记
只有右边有标记显然不可能
只有左边有标记那遍历左端点的时候肯定会经过这条边
因此我们选择的点数不可能比M大
而每一条匹配边又至少有一个点被标记
类似匈牙利算法,每条匹配边的左端点肯定要被遍历
因此这里N=M了
覆盖全部边了吗?
显然不存在一条边他的左端点没有标记而右端点有标记
我们讨论一下右端点标记的来历就行
如果右端点是非匹配点得到标记的,那么他应该会经过这条边,从而使左端点得到标记
反过来就是这个右端点是匹配点,那么他的标记肯定就是左端点给的,左端点应该有标记
什么,你说右端点的标记是另外一个左端点给的?
显然不可能啊,那这样你不就找到一条新的增广路了?
因为你左端点之前没有被遍历过,而右端点又被一个起点为未匹配的右端点遍历到了
这不就匹配+1了?
显然不存在啊
因此,我们得到了一个输出方案的方案
至于模板,就把匈牙利算法基本上拷贝一份打个标记就可以了
我就不贴了(懒