参考:《算法竞赛入门经典:训练指南》刘汝佳 陈锋 编著
《图论算法理论、实现及应用》
一、边独立集(匹配)
设无向图为 G(V, E) ,边的集合 E* ⊆ E,若 E* 中的任何两条边均不相邻,则称 E* 为 G 的边独立集(edge independent set),也称 E* 为 G 的匹配(matching)
所谓任何两条边均不相邻,通俗的讲,就是任何两条边都没有公共顶点
例如,在图(a)中,取 E* = {e1, e4, e7},则 E* 就是图 G 的一个边独立集,因为 E* 中每两条边都没有公共顶点
注意:
在无向图中存在将尽可能多的、相互独立的边包含到边的集合 E* 中的问题,所以边独立集有极大和最大的概念
最小边独立集的概念是没有意义的,因为对任何一个无向图 G(V, E) ,取 E* = ∅ (空集),总是满足边独立集的定义
若在 E* 中加入任意一条边所得到的集合都不是匹配,则称 E* 为极大匹配
边数最多的匹配称为最大匹配
最大匹配的边数称为边独立数或匹配数,记为 β1(G),简记为 β1
在图(a)中,{e2, e6},{e3, e5} 和 {e1, e4, e7} 都是极大匹配,{e1, e4, e7} 是最大匹配。因此 β1 = 3
在图(b)中,{e1, e4},{e2, e3} 和 {e4, e8} 都是极大匹配,也都是最大匹配,因此 β1 = 2
以下几个概念都是针对无向图 G(V, E) 中一个给定的匹配 M 而言的
在无向图 G 中,若边 (u, v) ∈ M,则称顶点 u 与 v 被 M 所匹配
设 v 是图 G 的一个顶点,如果 v 与 M 中的某条边关联,则称 v 为 匹配 M 的盖点
如果 v 不与任意一条属于匹配 M 的边关联,则称 v 为匹配 M 的未盖点
所谓盖点,就是被匹配中的边盖住了,而未盖点就是没有被匹配 M 中的边“盖住” 的顶点
例如,在图(a)所示的无向图中,取定 M = {e1, e4},M 中的边用粗线标明,则顶点 v1 与 v2 被 M 所匹配
v1、v2、v3 和 v4 是 M 的盖点,v5 和 v6 是 M 的未盖点
而在图(b)中,取定 M = {e1, e4, e7},则 G 中不存在未盖点
例 1 飞行员搭配问题 1 -- 最大匹配问题
飞行大队有若干个来自各地的飞行员,专门驾驶一种型号的飞机,这种飞机每架有两个飞行员
由于种种原因,例如互相配合的问题,有些飞行员不能在同一架飞机上飞行,问如何搭配飞行员,才能使出航的飞机最多
为简单起见,设有 10 个飞行员,图中的 v1, v2, … v10 就代表这 10 个飞行员
如果两个人可以同机飞行,就在他们之间连一条线,否则就不连
图中的 3 条粗线代表一种搭配方案
由于一个飞行员不能同时派往两架飞机,因此任何两条粗线不能有公共端点
因此该问题就转化为:如何找一个包含最多边的匹配,这个问题就是图的最大匹配问题
二、二分图(二部图)匹配问题
例 2 飞行员搭配问题 2 -- 二分图的最大匹配问题
在例 1 中,如果飞行员分成两部分,一部分是正驾驶员,一部分是副驾驶员
如何搭配正副驾驶员才能使得出航飞机最多的问题可以归结为一个二分图上的最大匹配问题
例如,假设有 4 个正驾驶员,有 5 个副驾驶员,飞机必须要有一名正驾驶员和一名副驾驶员才能起飞
正驾驶员和副驾驶员之间存在搭配的问题
图中, x1, x2, x3, x4 表示 4 个正驾驶员, y1, y2, y3, y4, y5 表示 5 个副驾驶员
正驾驶员之间不能搭配,副驾驶员之间也不能搭配,所以这是一个二分图
图中的 4 条粗线代表一种搭配方案。这个问题实际上是求一个二分图的最大匹配
为方便叙述,我们总是把二分图的两个结点集称为 X 和 Y,有时也称为左边和右边,其中左边是 X 集,右边是 Y 集,如图所示
这个问题可以用网络流解决,但用增广路算法更加简洁