参见度娘
二分图又称作二部图,是图论中的一种特殊模型。 设 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) (i∈A,j∈B),则称图 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 e⊆E,如果 ∀ ( 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 V0⊆V,如果 ∀ ( 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,u∈V0∨u∈V0,则称 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 e⊆E,使得 ∀ ( 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 1 1,跑一遍,搞定了。
增加超级源点和超级汇点,超级源点连向每个左边节点,然后左边节点按照图中原有边连向右边节点,每个右边节点又连向超级汇点。
每条新增的边权值设为 inf \inf inf,每条原有边权值不变。
顶标就用上了。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
流程:
问题来了,如何修改顶标?
我们可以让相等子图在原二分图的左边的节点全部值减去一个值 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+sv−d<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+sv−w(u,v) 的最小值。
KM 算法到此结束。