二分图及其算法

二分图

参见度娘

二分图又称作二部图,是图论中的一种特殊模型。 设 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 0 ⊆ E E_0 \sube E E0E,如果 ∀ ( u , v ) ∈ E 0 , ( u 2 , v 2 ) ∈ e , { u , v } ∩ { u 2 , v 2 } = ∅ \forall (u,v)\in E_0 , (u_2,v_2)\in e, \{u,v\}\cap\{u_2,v_2\}=\varnothing (u,v)E0,(u2,v2)e,{u,v}{u2,v2}=,则称 E 0 E_0 E0 G G G 的一个匹配。

完美匹配

二分图 G = ( V , E ) G = (V,E) G=(V,E) 中,左右两部分为 A A A B B B,对于匹配 E 0 E_0 E0,如果 ∣ E 0 ∣ = ∣ A ∣ = ∣ B ∣ |E_0| = |A| = |B| E0=A=B,则称 E 0 E_0 E0 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 0 E_0 E0,如果 ∣ E 0 ∣ = min ⁡ { ∣ A ∣ , ∣ B ∣ } |E_0| = \min\{|A|,|B|\} E0=min{A,B},则称 E 0 E_0 E0 G G G 的一个完全匹配。

最佳匹配

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

最大权匹配

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

增广路径

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

顶标

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

相等子图

二分图 G = ( V , E ) G= (V, E) G=(V,E) 中,如果存在一个匹配 E 0 ⊆ E E_0 \sube E E0E,使得 ∀ ( 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 0 ) (V,E_0) (V,E0) 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 算法到此结束。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值