Post 42


二分图学习笔记

从今天开始的未来5天将学习图论进阶,主要涉及进阶指南,luogu网课,以及有些(大量)图论定理的证明。

由于我的学习习惯,学个啥都得全弄明白可能导致进度偏慢。。不过严谨点总没太大坏处。

我们从二分图的定义说起

二分图:可以分成两组点集,点集内部无边相连,两点集之间有边。

十分好理解。

接下来要介绍二分图判定定理:一个图是二分图,当且仅当这个图不存在奇环。

我们需要证明必要性和充分性。

1.必要性。二分图的边是在两个集合里交替的,显然不会出现奇圈。

必要性:
考虑对图进行二分图染色。如果两个节点之间有一条长度为奇数的路径,那么显然两个点颜色不同,反之如果两个节点之间有一条长度为偶数的路径,那么两个点颜色必定相同(这是显然的)。
如果图中存在奇环,那么我们任取环上两点,可以发现如果从环的两边走,那么两条路径必定是一奇一偶的,所以我们无法就行二分图染色,即原图不是二分图。

充分性:
还是考虑二分图染色的过程。假设某个点的颜色既是黑色又是白色,那么说明从起点到这个点存在一条奇路径,也存在一条偶路径,那么我们就可以构造出一个奇环(因为两条路径之和是奇数)(注意这里的环不一定是简单环,有可能有某些边被走两次)。而原图不存在奇环,所以这种情况不可能发生,即原图一定可以被二分图染色,即原图就是个二分图。

这是来自ZQC的一个语言描述的证明,不过是正确的,想看更严谨的符号演绎证明(其实就是用符号表达啦):

img

这样我们就搞定了二分图相关的第一个定理。并且可以用它来进行二分图染色从而判定二分图。

接下来就是更重要的二分图匹配定理相关,包括:

  • Berge定理
  • Hall定理
  • Konig定理

hall定理是判定二分图是否存在完全匹配的定理,Konig等到点覆盖问题时会写。。

定理1:(Berge 1957)M是最大匹配的充要条件是G中无M的可增广轨

定理2:如果从一个点A出发,没有找到增广路径,那么无论再从别的点出发找到多少增广路径来改变现在的匹配,从A出发都永远找不到增广路径。

定理1,2可以看做匈牙利算法正确性的证明。

先给出定理1的证明(感谢LOJ群@pupil大佬的指点,我稍作改动使得更好理解):

必要性显然。充分性使用反证法证明。

如果匹配M不是最大匹配且无增广轨,设M’是最大匹配,异或后得到边集H。

对于H,每条边的顶点要么度数为2要么度数为1。

这种图只能是交错边偶环或交错边形成的链。并且可以知道必定有一条链其起点和终点都是非匹配点(因为点集不同,且M’要大),又因为这是一条交错边的链,所以这是M的一条增广轨,与假设矛盾。

因此匹配M在无增广轨的情况下必定是二分图最大匹配。

怕我说的有问题,再找一个网上的(一般的图论书里这种定理肯定有证明,有时间买一本)

假设M不是最大匹配,则说明存在比M更大的一个匹配M”,则取H ={M并M” - M交M”},则H里,顶点的度不是1就是2.不存在度为0的顶点。则H的连通片,或者是M”与M中的边交替出现的一个偶圈,或者是M”与M中的边交替出现的一条轨。又因为|M”| > |M|,必有H的某个连通片是轨,且此轨是M”的边为终止边(实际上包含起边和终边),于是得到了M的可增广轨,与M中无增广轨矛盾。

下面证明定理2:

假设我们对点A进行了两次,增广,第一次没有找到增广路,第二次找到了。下面需要证明这样是矛盾的,因为如果第二次可以找到,那么在第一次找时就应该找到了。

前面说过了实际上这个定理利用了1,或者它们证明的方法完全是一样的,我们可以用在第一次增广A时的那个匹配替换上面的M,而第二次增广A之后得到的那个匹配集显然就是上面的M”。两者的区别就在现在那个增广轨的位置已经确定了,因为这里的A点首先他必然不在M中,但是第二次从A处找到了一条增广轨,所以它必然的被加入了M”中,这也就意味着定理1证明中苦苦寻觅的那个增广轨在这里变成了确定的,就是从A开始的,也就是说实际上在第1次增广A时就应该找到这条增广轨了,于是矛盾。

匈牙利算法的原理就是不断找到增广路更新,从而得到最大的图匹配。

代码早就写过了,主要就是证明其正确性,毕竟背板子做图论题没有什么意思。

下午有时间再去思考一下这些定理以及推论,并且完成下Hall定理的推论。

接下来是二分图的覆盖与独立集

最小点覆盖问题

求出一个最小点集S,使得每条边都有至少一个端点被选中。

Konig定理

最小点覆盖=最大图匹配

证明

鸣谢@Matrix67

img

假如我们已经通过匈牙利算法求出了最大匹配(假设它等于M),下面给出的方法可以告诉我们,选哪M个点可以覆盖所有的边。
匈牙利算法需要我们从右边的某个没有匹配的点,走出一条使得“一条没被匹配、一条已经匹配过,再下一条又没匹配这样交替地出现”的路(交错轨,增广路)。但是,现在我们已经找到了最大匹配,已经不存在这样的路了。换句话说,我们能寻找到很多可能的增广路,但最后都以找不到“终点是还没有匹配过的点”而失败。我们给所有这样的点打上记号:从右边的所有没有匹配过的点出发,按照增广路的“交替出现”的要求可以走到的所有点(最后走出的路径是很多条不完整的增广路)。那么这些点组成了最小覆盖点集:右边所有没有打上记号的点,加上左边已经有记号的点。看图,右图中展示了两条这样的路径,标记了一共6个点(用 “√”表示)。那么,用红色圈起来的三个点就是我们的最小覆盖点集。
首先,为什么这样得到的点集点的个数恰好有M个呢?答案很简单,因为每个点都是某个匹配边的其中一个端点。如果右边的哪个点是没有匹配过的,那么它早就当成起点被标记了;如果左边的哪个点是没有匹配过的,那就走不到它那里去(否则就找到了一条完整的增广路)。而一个匹配边又不可能左端点是标记了的,同时右端点是没标记的(不然的话右边的点就可以经过这条边到达了)。因此,最后我们圈起来的点与匹配边一一对应。
其次,为什么这样得到的点集可以覆盖所有的边呢?答案同样简单。不可能存在某一条边,它的左端点是没有标记的,而右端点是有标记的。原因如下:如果这条边不属于我们的匹配边,那么左端点就可以通过这条边到达(从而得到标记);如果这条边属于我们的匹配边,那么右端点不可能是一条路径的起点,于是它的标记只能是从这条边的左端点过来的(想想匹配的定义),左端点就应该有标记。
最后,为什么这是最小的点覆盖集呢?这当然是最小的,不可能有比M还小的点覆盖集了,因为要覆盖这M条匹配边至少就需要M个点(再次回到匹配的定义)。
证完了。

进阶指南上正好相反,从左边非匹配点出发标记,最后左边未被标记的和右边被标记的和上面是一一对应的。

PS:Matrix67的post好多啊。而且都很有意思的样子。还有演算法笔记似乎是不错的学习资料:

http://www.csie.ntnu.edu.tw/~u91029/

好像是台湾某大学的。