二分图及其算法

二分图

参见度娘

二分图又称作二部图,是图论中的一种特殊模型。 设 G = ( V , E ) G=(V,E) G=(V,E)是一个无向图,如果顶点 V V V可分割为两个互不相交的子集 ( A , B ) (A,B) (A,B),并且图中的每条边 ( i , j ) (i,j) (i,j) 所关联的两个顶点 i i i j j j 分别属于这两个不同的顶点集 ( i ∈ A , j ∈ B ) (i \in A,j \in B) (iA,jB),则称图 G G G为一个二分图。

下文用 G G G 表示图, V V V 表示点集, E E E 表示边集, A A A 表示二分图左边部分, B B B 表示二分图右边部分, w i w_i wi 表示边 i i i 的权值, s i s_i si 表示点 i i i 的顶标

匹配

二分图 G = ( V , E ) G=(V,E) G=(V,E) 中,对于任意 e ⊆ E e \sube E eE,如果 ∀ ( u , v ) ∈ e , ( u 2 , v 2 ) ∈ e , { u , v } ∩ { u 2 , v 2 } = ∅ \forall (u,v)\in e, (u_2,v_2)\in e, \{u,v\}\cap\{u_2,v_2\}=\varnothing (u,v)e,(u2,v2)e,{u,v}{u2,v2}=,则称 e e e G G G 的一个匹配。

完美匹配

二分图 G = ( V , E ) G = (V,E) G=(V,E) 中,对于任意匹配 e e e, 如果 ∀ ( u , v ) ∈ e , a l l ( u , v ) = V \forall (u,v) \in e, {all(u,v)} = V (u,v)e,all(u,v)=V,则称 e e e G G G 的一个完美匹配。

最大匹配

二分图中,元素个数最多的匹配被称为最大匹配。

点覆盖

G = ( V , E ) G=(V,E) G=(V,E) 中,对于任意 V 0 ⊆ V V_0 \sube V V0V,如果 ∀ ( u , v ) ∈ E , u ∈ V 0 ∨ u ∈ V 0 \forall (u,v) \in E, u \in V_0 \lor u \in V_0 (u,v)E,uV0uV0,则称 V 0 V_0 V0 G G G 的一个点覆盖。

最小点覆盖

在任意图中,元素个数最少的点覆盖被称为最小点覆盖。

完备匹配

二分图 G = ( V , E ) G = (V,E) G=(V,E) 中,左右两部分为 A A A B B B,对于任意匹配 e e e,如果 ∀ ( u , v ) ∈ e , A ⊆ { a l l ( u , v ) } ∨ B ⊆ { a l l ( u , v ) } \forall (u,v) \in e, A\sube\{all(u,v)\}\lor B\sube\{all(u,v)\} (u,v)e,A{all(u,v)}B{all(u,v)},则称 e e e G G G 的一个完备匹配。

最佳匹配

带权二分图中权值和最大的完备匹配被称为最佳匹配。

最大权匹配

带权二分图中权值和最大的匹配被称为最大权匹配

增广路径

二分图中,被选择的边和没被选择的边交替出现,而且前后一定是未选择的边的一条路径

顶标

二分图中每个点的一个变量,有什么用后面就知道了,我们用 s s s 来表示。

相等子图

二分图 G = ( V , E ) G= (V, E) G=(V,E) 中,如果存在一个 e ⊆ E e \sube E eE,使得 ∀ ( u , v ) ∈ E , w ( u , v ) = s u + s v \forall (u,v) \in E, w_{(u,v)} = s_u + s_v (u,v)E,w(u,v)=su+sv,则 ( V , e ) (V,e) (V,e) G G G 的一个相等子图。

性质

  1. 点覆盖数 = 匹配数。
  2. 最大匹配数 = 最小覆盖数。
  3. 独立数 = 顶点数 - 最大匹配数。
  4. DAG的最小路径覆盖,将每个点拆点后作最大匹配,结果为 n - m
  5. 最大匹配数 = 左边匹配点 + 右边未匹配点
  6. 最小边覆盖 = 最大独立集 = 点的个数 - 最大匹配数。

最大匹配算法 - 匈牙利算法

寻找增广路径,然后扩展。没找到就完成了。

最大匹配算法 - 网络流算法

增加超级源点和超级汇点,超级源点连向每个左边节点,然后左边节点按照图中原有边连向右边节点,每个右边节点又连向超级汇点。

每条边权值设为 1 1 1,跑一遍,搞定了。

最大权匹配算法 - 网络流算法

增加超级源点和超级汇点,超级源点连向每个左边节点,然后左边节点按照图中原有边连向右边节点,每个右边节点又连向超级汇点。

每条新增的边权值设为 inf ⁡ \inf inf,每条原有边权值不变。

最佳匹配算法 - KM算法

顶标就用上了。KM算法遵循一个原则:对于任意边 ( u , v ) (u, v) (u,v) w ( u , v ) ≤ s u + s v w_{(u,v)} \leq s_u + s_v w(u,v)su+sv

流程:

  1. 初始化顶标
  2. 用匈牙利算法从相等子图中找完备匹配。
  3. 如果有完备匹配,说明找到最佳匹配了。
  4. 如果没有完备匹配,修改顶标并重新从第二步开始。

问题来了,如何修改顶标?

我们可以让相等子图在原二分图的左边的节点全部值减去一个值 d d d,右边全部加上 d d d

这样可以保证相等子图只增加,不减少。

u u u 在二分图左边, v v v 在右边。

如果 u , v u,v u,v 都在相等子图中,则 w ( u , v ) w_{(u,v)} w(u,v) 值不变。

如果 u u u 在相等子图中, v v v 不在,则 w ( u , v ) = s u + s v − d < s u + s v w_{(u,v)} = s_u + s_v - d < s_u + s_v w(u,v)=su+svd<su+sv,可能会增加到相等子图中。

如果 v v v 在相等子图中, u u u 不在,则 w ( u , v ) = s u + s v + d > s u + s v w_{(u,v)} = s_u + s_v + d > s_u + s_v w(u,v)=su+sv+d>su+sv,不会增加到相等子图中。

如果 u , v u,v u,v 都不在相等子图中,则 w ( u , v ) w_{(u,v)} w(u,v) 值不变。

所以 d d d 取值?取 s u + s v − w ( u , v ) s_u + s_v - w_{(u,v)} su+svw(u,v) 的最小值。

KM 算法到此结束。

你可能感兴趣的:(算法与数据结构,算法,图论)