二分图最大匹配及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 3. 最小路径覆盖
题目来源:经典问题 给出一个含N个顶点的有向无环图G。用 尽量少的不相交路径覆盖G的所有顶点, 即每个顶点严格属于一条路径。允许路径 的长度为0,即只含一个顶点。
例 3. 最小路径覆盖
因为含n条边的路径共覆盖了n+1个顶点, 所以对于任何一个路径覆盖,有一个显然 的关系:路径数+路径覆盖中的边数=N。
例 1. T HE P ERFECT S TALL
样例:N=5, M=5 方案:1-5, 2-3, 3-1, 5-2 解释:5号奶牛只能去2 号,那么1号奶牛只能 去5号,3号奶牛只能去 1号,于是4号奶牛无论 如何都不能被分配到喜 欢的牛栏。
奶牛编号 1 2 3 4 5
喜欢的牛栏 2, 5 2, 3, 4 1, 5 1, 2, 5 2
例 2. S TUDENT ' S M ORNING
考虑到建立的模型是个二分图,但不同的 是Y部的顶点最多可以连两条边,于是想 到了“拆点”的方法。
将N个学生作为顶点X1, X2, ……, XN,将每个 学校j拆成两个顶点Yj和Yj’。如果学生i愿意 参观学校j,那么连边(Xi, Yj)和(Xi, Yj’)。求 出这个二分图的最大匹配C,则C就等于上 一个模型中的最大流F。
由此可知,要使路径数最少,就要使得覆 盖中的边数最多。因为每个顶点只能出现 在一条路径上,所以最多是进来一次,出 去一次,这就让我们联想到了图的匹配。
匈牙利算法
然而,用网络流算法求最大匹配,显得过 于麻烦。利用二分图的特殊性质,将求最 大流的算法简化,就得到了匈牙利算法。
匈牙利算法
设M是图G=(V, E)的一个匹配。若顶点v是 M中某条边的端点,则称v是M的饱和点, 否则称v为M的非饱和点(未盖点)。
如果G的每个顶点都是M的饱和点,则称 M是G的一个完备匹配(完美匹配)。
匈牙利算法
s ← 0 l[1..m] ← 0 for i ← 1 to n c[1..m] ← false if find(i) s ← s + 1 end if end for
匈牙利算法
设二分图中有n个顶点,m条边,则每次 寻找增广路的时间复杂度为O(m),而一共 要寻找O(n)次,所以总的时间复杂度为 O(nm)。 如果是稠密图(比如完全二分图),那么 时间复杂度为O(n3)。 用邻接表存储,空间复杂度为O(m)。如果 是稠密图,那么往往用邻接矩阵存储,空 间复杂度为O(n2)。
例 1. T HE P ERFECT S TALL
由于转移的时间复杂度为O(M),所以总的 时间复杂度为O(M2M) 。空间复杂度似乎 也是O(M2M)。
注意到每当i减少1时,S中含的元素也会 少1个,所以通过S就可以唯一确定i,因 此状态中只需要记录S,从而空间复杂度 降为O(2百度文库)。
初始匹配常常选取成空的,即一开始所有 的顶点都是未盖点。
图例
X1 y1 X1 y1
X2
y2
X2
y2
X3
y3
X3
y3
X4
y4
X4
y4
X5
y5
X5
y5
X1
y1
X1
y1
X1
y1
X2
y2
X2
y2
X2
y2
X3
y3
X3
y3
X3
y3
X4
y4
X4
y4
X4
y4
X5
y5
X5
y5
X5
y5
X1
y1
X1
y1
X1
y1
X2
与网络流的优化方法类似,可以考虑每次 寻找若干条结点不相交的最短增广路,每 次沿多条增广路同时增广,这就是 Hopcroft-Karp算法。 可以证明,如果每次都是沿着尽可能多的 最短增广路同时增广,那么总的增广的次 数仅为O(n0.5),相比于匈牙利算法(增广 n次)要好很多。
H OPCROFT -K ARP 算法
匈牙利算法
当找不到增广路时,能否保证得到的匹配 是最大匹配呢? 可以,因为我们有增广路定理: 一个匹配是最大匹配当且仅当没有增广路。 注意,这个定理适用于任意图。
匈牙利算法
由增广路定理定理可知,从任何一个匹配 开始,不断沿着增广路增广,一定能得到 一个最大匹配。
于是就得到了匈牙利算法:从一个初始匹 配开始,不断找增广路并进行增广,直到 找不到增广路为止,那么最后得到的就是 最大匹配。寻找增广路可以用BFS或DFS。
例 2. S TUDENT ' S M ORNING
题目规定每个学校至少有两个学生参观, 而多于两个人参观同一个学校是没有任何 意义的,所以不妨限制每个学校最多有两 个学生参观。 建立如下的网络流模型:基本与上一个模 型相同,只是每一个Yj向汇点T连的边容量 下界改为0,上界改为2。求出S到T的最大 流F,如果F=2M则找到了一个可行的方案。 这个方法要比上一个简单得多,但似乎还 是有点麻烦。
匈牙利算法
设M是G的一个匹配,P是G的一条链。如 果P的边交替地一条是M中的边,一条不 是M中的边,则称P为M的交错轨。如果 交错轨P连接的是两个非饱和点,则称P 是增广路(增广链,增广轨)。 不难发现,对于增广路P,将在M中的边 删去,而将不在M中的边加上,那么得到 的仍然是一个匹配,但匹配数增加了1。 这就是匈牙利算法的原理。
例 1. T HE P ERFECT S TALL
用f[i][S]表示在前i头奶牛已经选择的牛栏 集合为S的情况下,其余的奶牛最多能有 多少可以选择喜欢的牛栏。 S是一个二进制数,其中S的第k位如果是1 则表示k号牛栏已经被使用,否则k号牛栏 可以被后面的奶牛使用。 对于状态f[i][S],枚举i号奶牛使用的牛栏j (要满足S的第j位是0),则f[i][S]就是所 有f[i-1][S-{j}]的最大值加1。
H OPCROFT -K ARP 算法
之后对于Y部的每个未盖点,用DFS寻找增 广路(只沿着距离减1的边移动)进行增 广(或对于X部的每个未盖点,沿着距离 加1的边寻找增广路)。 注意在整个DFS的过程中要将访问过的顶 点做标记,以保证增广路都是不相交的。 增广的次数为O(n0.5),又因为每次增广的 时间复杂度为O(m),所以总时间复杂度为 O(n0.5m)。这是目前已知的对于稀疏图最 有效的二分图匹配算法。
例 1. T HE P ERFECT S TALL
如果题目的规模比较小,那么有什么方法? 暴力搜索:O(N!),当N≥12时已经难以在 时限内出解。 在暴力搜索的基础上优化? 状态压缩+记忆化搜索(动态规划)
例 1. T HE P ERFECT S TALL
考虑用图论模型来表示题给的条件。 将每一头奶牛、每一个牛栏都作为图的顶 点:i号奶牛对应顶点Xi,j号牛栏对应顶点 Yj。如果i号奶牛喜欢j号牛栏,那么连边(Xi, Yj)。
X1
y1
Bfs:
x1 x2 x3 X4 x5 y1 y2 y3 y4 y5 0 0 0 X1 0 0 1 1 1 y1 1 1
X2
y2
X3
y3 X2 y2
X4
y4 X3 y3
X5
y5
X4
y4
X5
y5
X1
y1
X1
y1
X2
y2
X2
y2
X3
y3
X3
y3
X4
Y4
X4
Y4 y1 X1
x1 x2 x3 X4 y1 y2 y3 y4 X1 0
问题的关键在于用O(m)的时间找出尽量多 的最短增广路。 首先从所有X的未盖点进行BFS(仍然是找 增广路),计算每个X的顶点和Y的顶点的 距离。如果Y中有未盖点被访问到,就找 到了增广路,但找到Y中的第一个未盖点 时并不停止,而是等找出所有距离与Y相 等的顶点后停止。这样,找到的所有未盖 点的距离都相同,而且都是最短增广路。
例 2. S TUDENT ' S M ORNING
容易想到建立如下的网络流模型: 将N个学生作为顶点X1, X2, ……, XN,M个学 校作为顶点Y1, Y2, ……, YM。如果学生i愿意 参观学校j,那么连边(Xi, Yj),容量下界为0, 上界为1。从源点S向每一个Xi连边,容量 下界为0,上界为1。从每一个Yj向汇点T连 边,容量下界为2,上界为无穷大。问题 转化为求这个网络的一个可行流。 容量有上下界的可行流是不容易计算的, 考虑如何简化这个模型。
例 1. T HE P ERFECT S TALL
本题就是要求从图中选出尽可能多的边, 满足每个顶点至多是其中一条边的端点。 设G=(V, E)是一个图,M是E的一个子集。 如果M中的任何两条边都没有共同的端点, 则称M为G的一个匹配。G中边数最多的 匹配称为G的最大匹配。 要求一般图的最大匹配是比较困难的,但 是求二分图的匹配就容易得多。本题就是 求二分图最大匹配的问题。
求二分图最大匹配的算法
转化为求最大流的问题
可以将求二分图最大匹配的问题转化为最 大流的问题。 增加两个顶点S、T。对于X中的每个顶点Xi, 连边(S, Xi),容量为1。对于Y中的每个顶 点Yj,连边(Yj, T),容量为1。对于原图中 的边(Xi, Yj),将容量设为1。显而易见,S 到T的最大流就是原图的最大匹配。
y2
X2
y2
X2
y2
X3
y3
X3
y3
X3
y3
X4
y4
X4
y4
X4
y4
X5
y5
X5
y5
X5
y5
匈牙利算法
function find(i): boolean for j ← 1 to m if g[i][j] and (not c[j]) c[j] ← true if (l[j] = 0) or find(l[j]) l[j] ← i return true end if end if end for return false end function
X4 0
y1
0
y3 1
0
x3 2
0
y4 3
1
1
1
1
X2 y2 X2
y2
X3
y3 X3
y3
X4
Y4 X4
Y4
相关例题
例 2. S TUDENT ' S M ORNING
题目来源: SGU242 有N个学生要去参观M个学校,要求每个 学生至多只能参观一个学校(也可以一个 学校都不参观)。分别给出每个学生愿意 参观哪些学校,求一个满足每个学校至少 有两个学生参观的方案,或输出符合条件 的方案不存在。限制:M≤N≤200。
这个算法可以解决N≤20的数据。 如果规模更大,还有办法解决吗?
例 1. T HE P ERFECT S TALL
不难发现这个图的特点:可以将图的顶点 划分为两个集合X, Y,使得图的任何一条 边的一个端点在X中,另一个端点在Y中。 满足这个条件的图称为二分图(二部图)。 可以证明,一个图是二分图等价于图中不 含长度为奇数的环。 对于一个二分图G,如果X中的每个顶点都 与Y中的每个顶点有边相连,则称G为完全 二分图。
二分图最大匹配及其应用
二分图与图的匹配
例 1. T HE P ERFECT S TALL
题目来源:USACO, POJ1274 农夫John的牛棚共有M个牛栏,其中一共 养了N头奶牛。每头奶牛只愿意在它喜欢 的那些牛栏中产奶。一个牛栏只能容纳一 头奶牛,一头奶牛也只在一个牛栏中产奶。 请你将奶牛分配到牛栏中,使得愿意产奶 的奶牛数T最大。限制:N≤200,M≤200。
例 1. T HE P ERFECT S TALL
注意到如果对于1号奶牛选择1号牛栏,2 号奶牛选择2号牛栏的情况,答案为t,那 么对于1号奶牛选择2号牛栏,2号奶牛选 择1号牛栏的情况(即交换两头奶牛选择 的牛栏),答案仍为t。从中得到启发, 其实很多状态是冗余的。 只需记录有哪些奶牛和牛栏没有被用过, 答案就确定了,而那些用过的奶牛和牛栏 不需要考虑。
匈牙利算法
有没有更快的算法? 匈牙利算法是迭代的,也就是说你可以从 任何一个初始匹配开始使用匈牙利算法, 最后一定能得到一个最大匹配(增广路定 理的推论)。 如果先贪心一个初始匹配再使用匈牙利算 法,那么程序可能会快很多。 有没有时间复杂度更低的算法?
H OPCROFT -K ARP 算法
匈牙利算法
形象化地说,就是从二分图中找出一条路 径,使得路径的起点和终点都是没有被匹 配的点,而且路径经过的边是一条没被匹 配,一条已经匹配过,再下一条又没匹配 这样交替地出现。找到这样的路径后,显 然路径里没被匹配的边比已经匹配了的边 多一条,于是修改匹配图,把路径里所有 匹配过的边去掉,把没有匹配的边变成匹 配的,这样一来匹配数就比原来多了1。 不断执行上述操作,直到找不到这样的路 径为止。