距离上次更新已经 1409 天了,文章内容可能已经过时。

课程主页:

https://cs170.org/

https://inst.eecs.berkeley.edu/~cs170/fa18/

课程视频:

https://www.bilibili.com/video/BV1wK411g7ck

参考资料:

吴彧文(atyuwen)Algorithms.Exercises.solution

这次回顾Section 9。

1. Maximal Matching

假设maximal匹配的边集合为

E1={(u11,v11),,(un1,vn1)}

maximum匹配的边集合为

E2={(u12,v12),,(um2,vm2)}

任取e=(u,v)E1,或者eE2,或者eE2,对于第二种情形,E2中必然存在一条边包含uv,这是因为如果该条件不满足,则E2中可以添加e,这就与maximum匹配的定义矛盾。

因此E1中的每一条边或者和E2中一条边对应,或者和E2中两条边对应,假设这两种情形的数量分别为x,y,那么计算顶点的数量

2x+2y=2n2x+4y=2m

所以

4n=4x+4y2x+4y=2mnm2

2. Bipartite Vertex Cover

图片来自于吴彧文(atyuwen)Algorithms.Exercises.solution 7.23,该解答参考了大佬的做法。

假设二部图的两步分别为U,V,现在增加顶点S,T,其中SU中每条边都相连,TV中每条边都相连。

假设顶点覆盖为C,定义

L=CUR=CVM=ULN=VR

由于C=LR,并且C为顶点覆盖,所以M,N之间必然不存在边,考虑割(LNT,SMR),根据上图可知,割为

  • LR的边

从而顶点覆盖正好对应了一个分割;反之,构造满足上述条件的图,即M,N之间不存在边,然后求出割(SMR,LNT),那么LR必然为顶点覆盖,从而分割也对应了一个顶点覆盖。

因此两者一一对应,求最小顶点覆盖的问题可以转化为求最小割的问题。

3. Reducing Vertex Cover to Set Cover

对于图G=(V,E),构造U=V,以及子集Si,其中子集的构造如下:

  • 对于vV,定义集合Sv
    • Sv={v}{u|(v,u)E}

那么最小顶点覆盖对应于U,Si的集合覆盖。