图论常见模型2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
14
二分图带权覆盖集
首先,我们可以对所有费用取对数lg,这 样把积的关系转换成和的关系。 加入源点S和汇点T,在S和Xi之间连一条 容量为log(Ri)的边(其中Ri为在第i行的火 炮的费用),在Yi和T之间连一条容量为 log(Ci)的边。X和Y之间的原边容量设为正 无穷大。 求该网络的最大流……这个最大流的含义?
5
如图所示的割,容量为12+14=26
6
例题分析
Cops and Thieves
Ural 1277 题目大意:有许多小偷在S城市,他们要去F 城市的博物馆偷东西。有K个警察被布署在除 K 了S和F以外的城市上,要看守城市i需要Xi个 警察。问能否有一种方案可以使得S到F的所 有路上都有城市有警察看守。 城市数N<=100, 边数M<=10000
38
APIO 2007 Backup
贪心真的无效么? 仔细观察各种反例…… 出现错误的地方在于,贪心选择的解无法 “退回”,则下一步的最优解往往恰恰是 上一步交替“取反”而得……
交错路! 交错路!
匹配! 匹配!
39
APIO 2007 Backup
图论模型——
把点按奇偶分为X集和Y集,问题即变为求含 K条边的最小权匹配
7
例题分析
Sample Input 1
10 5515 1 6 6 11 1 12 13 24 34 45
Sample Input 2
10 5515 1 4 4 11 1 12 13 24 34 45
Sample Output 1 No
Sample Output 2
YES
8
例题分析
6 2 1 1 4 11 1 5 1 1 4 2 11 1 5 4
图论常见模型(2)
roba269@gmail.com
1
最大流常见转化
无向图变为有向图
通常情况下,直接把容量为C的无向边变成两 个方向容量均为C的有向边即可 因为在任何一条边里流必定可以只向一个方向
2
最大流常见转化
点容量变边容量
拆点即可,注意一点只出,另一点只入
3
最大流常见转化
无向图的拆点
u v
3 6
3 4
9
例题分析
因为题目相当于限制“点”的流量,这不 符合最大流的要求。于是我们把每个点k拆 成两个点k和k’,这两个点之间的边容量为 该城市需要的警察数。 拆点以后k负责入度,k’负责出度。注意原图 是无向图,因此要在两个方向都添加边。
10
例题分析
最后以S为源,以F为汇求最大流,即是该 网络的最小割,也就是控制所有路径需要 的最少警察数。
11
例题分析
Paratroopers
TOJ 2634 题目大意:在一个M*N的方格上有一些敌人, 我方在每一行和每一列上都设有激光炮,每发 射一次就可以消灭该行或该列上所有敌人。每 个激光炮有一个>1.0的费用,最后的总费用是 所有开火的激光炮的费用的乘积。 问要消灭所有敌人,最少的费用是多少? M,N<=50
把格子黑白染色之后转成二分图,即转化为 带权独立集问题
19
二分图带权独立集
给定二分图,每个点上有一非负权值,求一 个独立集使得集合中点的权值和最大。 建图方式:添加源和汇,源和汇分别连到两 侧点集,容量为点的权值,原二分图中的边 权为正无穷。求最大流(最小割)可得最小 点权覆盖集,设权值为f。 除孤立点外,最小覆盖集与最大独立集互补。 故最终结果为 所有点权总和减去f
总花费为三部分之和,净利润为所有任务 的收益增去总的花费。求最小割,即使得 a+b+c最小,也即净利润最大。
30
最小费用流
概念:
每条边上有两个权值,容量c和费用w。 现在要求在最大流的基础上,使得 ∑f(u,v)*w(u,v)最小。 ∑f(u,v)*w(u,v)
实质:更一般的网络流问题
当费用为0时,为最大流问题 当容量为1时,为最短路问题
给定直线上的N个楼,现有K条网线,要求 给其中的2K个楼两两配对,使得网线的总 长度尽可能小。 N <= 100,000, K <= N/2
34
APIO 2007 Backup
如图最优解为连接1-2,3-4,总长为4
35
APIO 2007 Backup
容易发现,选的边一定不会互相覆盖,即 对于四个点a<b<c<d,若要求选两条边,则 (a-c, b-d)必定不是最优解,因为显然(a-b, cd)更优。 进一步地,选择的楼必定两两相邻 DP?
28
CEOI 2008 Order
回到原题,CEOI此题的不同之处是,允许 出现“租”的情况 中间边的容量不为无穷大?
29
CEOI 2008 Order
割与方案仍然对应
S集中的点表示要完成的任务以及要买的机器 若任务在S集,所需机器在T集,租金a则计入 割的容量中 若任务不在S集,“浪费”的收益b计入割容量 若机器在S集,买机器花费c计入割的容量
KM? —— ——不合适 考虑求最小费用路的最短增广路算法
每次选择最短路增广,共增广K次……
这样能比DP更快?? @@
40
APIO 2007 Backup
两个基本操作
选最短路 增广
回到线性模型——
可增广路一定是这样连续的一段 [不选,选,不选,选,不选]… 我们把这样的一段当做一个元素
41
APIO 2007 Backup
32
最小费用增广路相关
最小费用增广路用于求费用流的过程中。 这是一个有“贪心”思想的方法,每次找 费用之和最小的一条增广路进行增广,就 可以保证得到最大流时的费用是最小的。 实际上我们有更强的结论:设每次增广后 得到流值为f,则此时的费用是在所有流值 为f的流里能取得的最小费用。
33
APIO 2007 Backup
43
SPOJ COVER
匹配? 把每个点x拆成左右两个点(x1,x2),对原图 中的边(x->y),新图中添边(x1-y2) (x->y) (x1-y2) 则新图的一个匹配对应原图中的一种选法
二分图没有边共点 <-> 原图没有边共头共尾
44
SPOJ COVER
现在只要求选出K条边 转成最小费用流?用最短增广路求K次?
31
最小费用流
最小费用增广路算法
残量网络中费用的定义:对于原图中的边 w(u,v),残量网络中w’(u,v) = w(u,v), w’(v,u) = w(u,v) 在残量网络中求最小费用路,即以w’为权值的 从s到t的最短路(利用Bellman-Ford)。 沿最小费用路增广,直到不能找到s-t路为止。 最后得到的就是最小费用流。
12
例题分析
Sample Input
445 2.0 7.0 5.0 2.0 1.5 2.0 2.0 8.0 11 22 33 44 14
Sample Output 16.0000 解释:位于1,4行和2,3列 的火炮开火 类二分图? 如果没有费用的问 题……
13
二分图带权覆盖集
如果火炮的费用都是单位1…… 令X集为横坐标,Y集为纵坐标,如果(i,j) 位置有一个敌人,则在(Xi, Yj)之间连一条 边,于是最优解就是一个二分图最小覆盖。 费用如何处理?
复杂度O(MNK)…
45
SPOJ COVER
• 贪心初始流,然后进行调整? 我们没有利用到这个条件——
有向边的权值为它的两端点权值之和
如何利用?
46
SPOJ COVER
实际上可以发现,对一条增广路的增广, 就是加上该路两端的两个未配点的权值。 故寻找最小费用路变为寻找最小权值和的 未配点对(xi,yj)
把每个区间当作一个元素 初始时,全部为[i,i]类型,权值为长度 用相应数据结构(堆或者平衡树)维护
每次选择权值最小的一个元素(设权为v) 增广后,将其与其左右相邻的元素(设权为 v1,v2)合并,新的权值变为(v1+v2-v)
复杂度O(klogn)
42
SPOJ COVER
给N个点,每个点都有一个权值,某些点 之间存在有向边,有向边的权值为它的两 端点权值之和。现在要求从中选出K条边, 使得没有任何两条边共头或共尾,问K条 边的权值和最小为多少。 N<=10^4,边数M<=10^6,K<=100。
23
CEOI 2008 Order
24
NOI 2006 Profit
复习一个简化版问题——NOI 2006 Profit 每个用户群Ci需要两个中转站ai和bi,已知 建造每个中转站的花费以及为每个用户群 服务所得收入。求总利润的最大值。
总利润 = 收入 - 花费
25
NOI 2006 Profit
新加S,T,对S和用户群连边,容量为该用 户群的收益,对通讯站和T连边,容量为该 通讯站的花费。对用户群和其所需通讯站 连边,容易为正无穷。 此网络的一个割对应一种方案: S集中的 点为选择服务的用户群及修建的通讯站, 割开的边是“不为某些用户服务故没有得 到的收益”+“建造某些通讯站的花费”
26
NOI 2006 Profit
20
互补的证明
对于一条边(u,v),覆盖集要求 u∈ A∨ v∈ A 独立集要求
¬(u ∈ A ∧ v ∈ A) ⇔ (u ∉ A ∨ v ∉ A) ⇔ (u ∈ A ∨ v ∈ A)
即,若我们找到一个A满足覆盖集的要求, 则它的补集满足独立集的要求
21
最小割转化相关
最大权闭合子图
TOJ 2944 Mussy Paper NOI2006 Profit
36
APIO 2007 Backup
用opt[n][k]表示前n个点中选出k条边的最优 解,则有方程
opt[n][k] = min(opt[n-1][k], opt[n-2][k-1] + pos[n] - pos[n-1])
O(NK) TLE…
37
APIO 2007 Backup
贪心? 每次选最短的两楼相连? 很容易举出反例 (1,3,4,6,100) ……
1 1 2 S 2 3 3 用户群 T
S集中的点为 选择服务的用 户群及修建的 通讯站
4 通讯站
27
NOI 2006 Profit
割开的边是“不为某些用户服务故没有得 到的收益”+“建造某些通讯站的花费”, 记为F 记为所有用户服务的收入之和为Tot,则 Tot – F 即我们最后要求的结果 最小割保证求得的F最小,也就保证了TotF最大。
15
二分图带权覆盖集
最大流=最小割 回忆最小割的定义:
因为X集和Y集之间边容量为正无穷,最小割 不可能“割开”这些边。即,对每条(Xi,Yj)边, 要么Xi,Yj都属于S集,要么都属于T集。 “割开”的边是什么呢?
16
二分图带权覆盖集
最小割的意义:
可以理解为,属于S集的Yj点,即表示第j列的 炮开火。同样,属于T集的Xi点,即表示第i行 的炮开火 一个割即对应一种消灭敌人的方案 最小割即是费用最小的方案 注意输出时要求emin_cut
最大密度子图
TOJ 2672 Hard Life
ቤተ መጻሕፍቲ ባይዱ22
CEOI 2008 Order
给定一些任务,每个任务需要某些机器来 完成,完成每个任务可以有相应的收益。 机器可以买也可以租。不同的机器有不同 的价格,不同的机器对不同的任务分别有 不同的租金。机器只需买一次就可以无限 使用,如果租机器则只能用在当前这次。 求最大的收益。 机器数<=1200, 任务数<=1200
u
u’
v
v’
4
最小割
一个网络的割(cut)是指把网络的点集划分 为两部分S和T,使得s∈S,t∈T。 割的容量(capacity)是指所有起点在S集,终 (capacity) S 点在T集的边的容量的总和,即 ∑u∈S and v∈Tc(u,v) 最大流最小割定理:一个网络的最大流等 于最小割的容量。
47
SPOJ COVER
每次增广时,从左边选一个未配点xi,进 行BFS/DFS找交错路,找到右边所有符合 条件的未配点yj,则可以得出所有候选点 对。 从每点BFS复杂度为O(M),每次要检验 O(N)个左侧未配点,增广K次…… 复杂度仍然O(MNK)?
48
SPOJ COVER
实际上,预先给左侧点排序,按照权值的 递增序依次检查未配点,则无须对每个点 都重新找增广路,直接遍历一次即可。
17
二分图带权覆盖集
1 2.0 7.0 s 5.0 3 2.0 4 ∞ ∞ 2 ∞ ∞ 3 8.0 4 2 2.0 2.0 t ∞ 1 1.5
18
二分图带权独立集
HDU 1569 方格取数(2)
http://acm.hdu.edu.cn/showproblem.php?pid=1569 给你一个m*n的格子的棋盘,每个格子里面有 一个非负数。从中取出若干个数,使得任意的 两个数所在的格子没有公共边,就是说所取数 所在的2个格子不能相邻,并且取出的数的和最 大。
二分图带权覆盖集
首先,我们可以对所有费用取对数lg,这 样把积的关系转换成和的关系。 加入源点S和汇点T,在S和Xi之间连一条 容量为log(Ri)的边(其中Ri为在第i行的火 炮的费用),在Yi和T之间连一条容量为 log(Ci)的边。X和Y之间的原边容量设为正 无穷大。 求该网络的最大流……这个最大流的含义?
5
如图所示的割,容量为12+14=26
6
例题分析
Cops and Thieves
Ural 1277 题目大意:有许多小偷在S城市,他们要去F 城市的博物馆偷东西。有K个警察被布署在除 K 了S和F以外的城市上,要看守城市i需要Xi个 警察。问能否有一种方案可以使得S到F的所 有路上都有城市有警察看守。 城市数N<=100, 边数M<=10000
38
APIO 2007 Backup
贪心真的无效么? 仔细观察各种反例…… 出现错误的地方在于,贪心选择的解无法 “退回”,则下一步的最优解往往恰恰是 上一步交替“取反”而得……
交错路! 交错路!
匹配! 匹配!
39
APIO 2007 Backup
图论模型——
把点按奇偶分为X集和Y集,问题即变为求含 K条边的最小权匹配
7
例题分析
Sample Input 1
10 5515 1 6 6 11 1 12 13 24 34 45
Sample Input 2
10 5515 1 4 4 11 1 12 13 24 34 45
Sample Output 1 No
Sample Output 2
YES
8
例题分析
6 2 1 1 4 11 1 5 1 1 4 2 11 1 5 4
图论常见模型(2)
roba269@gmail.com
1
最大流常见转化
无向图变为有向图
通常情况下,直接把容量为C的无向边变成两 个方向容量均为C的有向边即可 因为在任何一条边里流必定可以只向一个方向
2
最大流常见转化
点容量变边容量
拆点即可,注意一点只出,另一点只入
3
最大流常见转化
无向图的拆点
u v
3 6
3 4
9
例题分析
因为题目相当于限制“点”的流量,这不 符合最大流的要求。于是我们把每个点k拆 成两个点k和k’,这两个点之间的边容量为 该城市需要的警察数。 拆点以后k负责入度,k’负责出度。注意原图 是无向图,因此要在两个方向都添加边。
10
例题分析
最后以S为源,以F为汇求最大流,即是该 网络的最小割,也就是控制所有路径需要 的最少警察数。
11
例题分析
Paratroopers
TOJ 2634 题目大意:在一个M*N的方格上有一些敌人, 我方在每一行和每一列上都设有激光炮,每发 射一次就可以消灭该行或该列上所有敌人。每 个激光炮有一个>1.0的费用,最后的总费用是 所有开火的激光炮的费用的乘积。 问要消灭所有敌人,最少的费用是多少? M,N<=50
把格子黑白染色之后转成二分图,即转化为 带权独立集问题
19
二分图带权独立集
给定二分图,每个点上有一非负权值,求一 个独立集使得集合中点的权值和最大。 建图方式:添加源和汇,源和汇分别连到两 侧点集,容量为点的权值,原二分图中的边 权为正无穷。求最大流(最小割)可得最小 点权覆盖集,设权值为f。 除孤立点外,最小覆盖集与最大独立集互补。 故最终结果为 所有点权总和减去f
总花费为三部分之和,净利润为所有任务 的收益增去总的花费。求最小割,即使得 a+b+c最小,也即净利润最大。
30
最小费用流
概念:
每条边上有两个权值,容量c和费用w。 现在要求在最大流的基础上,使得 ∑f(u,v)*w(u,v)最小。 ∑f(u,v)*w(u,v)
实质:更一般的网络流问题
当费用为0时,为最大流问题 当容量为1时,为最短路问题
给定直线上的N个楼,现有K条网线,要求 给其中的2K个楼两两配对,使得网线的总 长度尽可能小。 N <= 100,000, K <= N/2
34
APIO 2007 Backup
如图最优解为连接1-2,3-4,总长为4
35
APIO 2007 Backup
容易发现,选的边一定不会互相覆盖,即 对于四个点a<b<c<d,若要求选两条边,则 (a-c, b-d)必定不是最优解,因为显然(a-b, cd)更优。 进一步地,选择的楼必定两两相邻 DP?
28
CEOI 2008 Order
回到原题,CEOI此题的不同之处是,允许 出现“租”的情况 中间边的容量不为无穷大?
29
CEOI 2008 Order
割与方案仍然对应
S集中的点表示要完成的任务以及要买的机器 若任务在S集,所需机器在T集,租金a则计入 割的容量中 若任务不在S集,“浪费”的收益b计入割容量 若机器在S集,买机器花费c计入割的容量
KM? —— ——不合适 考虑求最小费用路的最短增广路算法
每次选择最短路增广,共增广K次……
这样能比DP更快?? @@
40
APIO 2007 Backup
两个基本操作
选最短路 增广
回到线性模型——
可增广路一定是这样连续的一段 [不选,选,不选,选,不选]… 我们把这样的一段当做一个元素
41
APIO 2007 Backup
32
最小费用增广路相关
最小费用增广路用于求费用流的过程中。 这是一个有“贪心”思想的方法,每次找 费用之和最小的一条增广路进行增广,就 可以保证得到最大流时的费用是最小的。 实际上我们有更强的结论:设每次增广后 得到流值为f,则此时的费用是在所有流值 为f的流里能取得的最小费用。
33
APIO 2007 Backup
43
SPOJ COVER
匹配? 把每个点x拆成左右两个点(x1,x2),对原图 中的边(x->y),新图中添边(x1-y2) (x->y) (x1-y2) 则新图的一个匹配对应原图中的一种选法
二分图没有边共点 <-> 原图没有边共头共尾
44
SPOJ COVER
现在只要求选出K条边 转成最小费用流?用最短增广路求K次?
31
最小费用流
最小费用增广路算法
残量网络中费用的定义:对于原图中的边 w(u,v),残量网络中w’(u,v) = w(u,v), w’(v,u) = w(u,v) 在残量网络中求最小费用路,即以w’为权值的 从s到t的最短路(利用Bellman-Ford)。 沿最小费用路增广,直到不能找到s-t路为止。 最后得到的就是最小费用流。
12
例题分析
Sample Input
445 2.0 7.0 5.0 2.0 1.5 2.0 2.0 8.0 11 22 33 44 14
Sample Output 16.0000 解释:位于1,4行和2,3列 的火炮开火 类二分图? 如果没有费用的问 题……
13
二分图带权覆盖集
如果火炮的费用都是单位1…… 令X集为横坐标,Y集为纵坐标,如果(i,j) 位置有一个敌人,则在(Xi, Yj)之间连一条 边,于是最优解就是一个二分图最小覆盖。 费用如何处理?
复杂度O(MNK)…
45
SPOJ COVER
• 贪心初始流,然后进行调整? 我们没有利用到这个条件——
有向边的权值为它的两端点权值之和
如何利用?
46
SPOJ COVER
实际上可以发现,对一条增广路的增广, 就是加上该路两端的两个未配点的权值。 故寻找最小费用路变为寻找最小权值和的 未配点对(xi,yj)
把每个区间当作一个元素 初始时,全部为[i,i]类型,权值为长度 用相应数据结构(堆或者平衡树)维护
每次选择权值最小的一个元素(设权为v) 增广后,将其与其左右相邻的元素(设权为 v1,v2)合并,新的权值变为(v1+v2-v)
复杂度O(klogn)
42
SPOJ COVER
给N个点,每个点都有一个权值,某些点 之间存在有向边,有向边的权值为它的两 端点权值之和。现在要求从中选出K条边, 使得没有任何两条边共头或共尾,问K条 边的权值和最小为多少。 N<=10^4,边数M<=10^6,K<=100。
23
CEOI 2008 Order
24
NOI 2006 Profit
复习一个简化版问题——NOI 2006 Profit 每个用户群Ci需要两个中转站ai和bi,已知 建造每个中转站的花费以及为每个用户群 服务所得收入。求总利润的最大值。
总利润 = 收入 - 花费
25
NOI 2006 Profit
新加S,T,对S和用户群连边,容量为该用 户群的收益,对通讯站和T连边,容量为该 通讯站的花费。对用户群和其所需通讯站 连边,容易为正无穷。 此网络的一个割对应一种方案: S集中的 点为选择服务的用户群及修建的通讯站, 割开的边是“不为某些用户服务故没有得 到的收益”+“建造某些通讯站的花费”
26
NOI 2006 Profit
20
互补的证明
对于一条边(u,v),覆盖集要求 u∈ A∨ v∈ A 独立集要求
¬(u ∈ A ∧ v ∈ A) ⇔ (u ∉ A ∨ v ∉ A) ⇔ (u ∈ A ∨ v ∈ A)
即,若我们找到一个A满足覆盖集的要求, 则它的补集满足独立集的要求
21
最小割转化相关
最大权闭合子图
TOJ 2944 Mussy Paper NOI2006 Profit
36
APIO 2007 Backup
用opt[n][k]表示前n个点中选出k条边的最优 解,则有方程
opt[n][k] = min(opt[n-1][k], opt[n-2][k-1] + pos[n] - pos[n-1])
O(NK) TLE…
37
APIO 2007 Backup
贪心? 每次选最短的两楼相连? 很容易举出反例 (1,3,4,6,100) ……
1 1 2 S 2 3 3 用户群 T
S集中的点为 选择服务的用 户群及修建的 通讯站
4 通讯站
27
NOI 2006 Profit
割开的边是“不为某些用户服务故没有得 到的收益”+“建造某些通讯站的花费”, 记为F 记为所有用户服务的收入之和为Tot,则 Tot – F 即我们最后要求的结果 最小割保证求得的F最小,也就保证了TotF最大。
15
二分图带权覆盖集
最大流=最小割 回忆最小割的定义:
因为X集和Y集之间边容量为正无穷,最小割 不可能“割开”这些边。即,对每条(Xi,Yj)边, 要么Xi,Yj都属于S集,要么都属于T集。 “割开”的边是什么呢?
16
二分图带权覆盖集
最小割的意义:
可以理解为,属于S集的Yj点,即表示第j列的 炮开火。同样,属于T集的Xi点,即表示第i行 的炮开火 一个割即对应一种消灭敌人的方案 最小割即是费用最小的方案 注意输出时要求emin_cut
最大密度子图
TOJ 2672 Hard Life
ቤተ መጻሕፍቲ ባይዱ22
CEOI 2008 Order
给定一些任务,每个任务需要某些机器来 完成,完成每个任务可以有相应的收益。 机器可以买也可以租。不同的机器有不同 的价格,不同的机器对不同的任务分别有 不同的租金。机器只需买一次就可以无限 使用,如果租机器则只能用在当前这次。 求最大的收益。 机器数<=1200, 任务数<=1200
u
u’
v
v’
4
最小割
一个网络的割(cut)是指把网络的点集划分 为两部分S和T,使得s∈S,t∈T。 割的容量(capacity)是指所有起点在S集,终 (capacity) S 点在T集的边的容量的总和,即 ∑u∈S and v∈Tc(u,v) 最大流最小割定理:一个网络的最大流等 于最小割的容量。
47
SPOJ COVER
每次增广时,从左边选一个未配点xi,进 行BFS/DFS找交错路,找到右边所有符合 条件的未配点yj,则可以得出所有候选点 对。 从每点BFS复杂度为O(M),每次要检验 O(N)个左侧未配点,增广K次…… 复杂度仍然O(MNK)?
48
SPOJ COVER
实际上,预先给左侧点排序,按照权值的 递增序依次检查未配点,则无须对每个点 都重新找增广路,直接遍历一次即可。
17
二分图带权覆盖集
1 2.0 7.0 s 5.0 3 2.0 4 ∞ ∞ 2 ∞ ∞ 3 8.0 4 2 2.0 2.0 t ∞ 1 1.5
18
二分图带权独立集
HDU 1569 方格取数(2)
http://acm.hdu.edu.cn/showproblem.php?pid=1569 给你一个m*n的格子的棋盘,每个格子里面有 一个非负数。从中取出若干个数,使得任意的 两个数所在的格子没有公共边,就是说所取数 所在的2个格子不能相邻,并且取出的数的和最 大。