网络流建模汇总by Edelweiss
网络流比较考思维,一般来说只要建模正确,就可以直接连边套模板了。
(加*的都是感觉比较经典/巧妙的题)
文章目录
- 最大流
- *POJ1149PIGS
- POJ1637Sightseeing tour
- POJ2391Ombrophobic Bovines
- POJ2699The Maximum Number of Strong Kings
- POJ3281Dining
- *JOJ2453Candy
- ZOJ2760How Many Shortest Path
- WOJ1124Football Coach
- SGU326Perspective
- *SGU438The Glorious Karlutka River =)
- *SPOJ287Smart Network Administrator
- SPOJ962Intergalactic Map
- 最小割
- HOJ2634How to earn more
- HOJ2713Matrix1
- POJ1815Friendship
- ZOJ2532Internship
- Ural1277Cops and Thieves
- *SPOJ839Optimal Marks
- *SPOJ1693Coconuts
- Beijing Regional 2008 Problem A Destroying the bus stations
- *bzoj3438小M的作物
- *有向图破坏 Destroying the Graph
- 有上下界
- 费用流
- HOJ2543Stone IV
- HOJ2715Matrix3
- HOJ 2739 The Chinese Postman Problem
- *POJ 3680 Intervals
- SPOJ371Boxes
- *BASHU2445餐巾问题
- *剪刀石头布
- 总结
最大流
*POJ1149PIGS
把猪圈每天都拆出一个点。
点数是 n m nm nm级别的,考虑优化最原始的连边:
哪些点是等价的呢?又有哪些边是没用的呢?
- 点:流量的来源/去向完全相同,或者连边 ( u , v , + ∞ ) (u, v,+\infty) (u,v,+∞)且 v v v仅有 u u u这一个流量来源。
- 边:合并后的两点之间的多条边(可以由一条总流量大小的边替代)
经过复杂的整理之后(过程略),得到简化模型:
- 每个顾客是一个结点,均向汇点连一条容量为购买上限的边。
- 源点向所有猪圈的第一个顾客容量为相应数量的边。若多个猪圈指向同一个顾客,只用连一条容量为总数量的边。
- 对于每个猪圈,假设有 n n n个顾客光顾过,则第 i ( 1 ≤ i < n ) i(1\leq i<n) i(1≤i<n)个顾客向第 i + 1 i+1 i+1个顾客连一条容量为 + ∞ +\infty +∞的边。
(顾客之间的连边还可以简化/缩点,但过于麻烦且没有必要)
点数是 n n n级别的。
(形式上很优美)
POJ1637Sightseeing tour
当且仅当图中所有点入度=出度时存在欧拉回路。
首先随便给无向边定向,求此时每个点的出度-入度的值 d i d_i di。若 d i d_i di为奇数,则无解(欧拉回路中不能存在总度数为奇数的点)。所以所有 d i d_i di都为偶数,设 x i = d i 2 x_i=\dfrac {d_i}{2} xi=2di,对于点 i i i,只要将连向它的 x i x_i xi条同向的边改成另一个方向即可。
问题转成了改变一些边的方向,使得每个点入度=出度,考虑构图:
- 若 d i > 0 d_i>0 di>0,连边 ( S , i , d i ) (S,i,d_i) (S,i,di);若 d i < 0 d_i<0 di<0,连边 ( i , T , − d i ) (i,T,-d_i) (i,T,−di)
- 仅保留图中任意定向后的无向边(删去原来的有向边),且每条边容量为1。
考虑流过这条边相当改变了这条边的方向,最后检查是否满流即可。
POJ2391Ombrophobic Bovines
构图:
- 拆点(每个点拆为入度 i i i和出度 i ′ i' i′)。源点向 i i i连容量为 A i A_i Ai的边, i ′ i' i′向汇点连容量为 B i B_i Bi的边。
- 先求出两两之间最短距离,二分时间 m i d mid mid,每次只连 d i s ( i , j ) ≤ m i d dis(i,j)\leq mid dis(i,j)≤mid的边( i , j ′ , + ∞ i, j',+\infty i,j′,+∞),判断是否满流。
注意不拆点是错的:
( i , j ) , ( j , k ) (i,j),(j,k) (i,j),(j,k)连边而 d i s ( i , k ) > m i d dis(i,k)>mid dis(i,k)>mid但此时 i i i可以流到 k k k,所以连接 ( i , j ) (i,j) (i,j)时必须要强制 j j j就是终点,所以要拆点把入度出度分开。
POJ2699The Maximum Number of Strong Kings
原文有点问题:
strong king并不一定是最大的 k k k个,但最大的 k k k个是strong king一定是合法的(证明略)。
n ≤ 10 n\leq 10 n≤10,考虑枚举strong king的个数 k k k,将选手按得分降序排序后选择前 k k k个:
- 每个选手看做一个点 i i i,连边 ( i , T , s c o r e i ) (i,T,score_i) (i,T,scorei),若 i i i为strong king,则再拆出一个点 i ′ i' i′,连边 ( i ′ , i , k t h i ) (i',i,kth_i) (i′,i,kthi)( k t h i kth_i kthi表示分数比 i i i高的选手数,拆分出来强制选满)。
- 每个比赛看做一个点 i i i,源点向 i i i连容量为1的边,设比赛双方为 ( u , v ) ( s c o r e u < s c o r e v ) (u,v)(score_u<score_v) (u,v)(scoreu<scorev),若 u u u为strong king,则连边 ( i , u ’ , 1 ) (i,u’,1) (i,u’,1),否则连边 ( i , u , 1 ) , ( i , v , 1 ) (i,u,1),(i,v,1) (i,u,1),(i,v,1)。
最后判断是否满流即可。
POJ3281Dining
每头牛喜欢的食品和饮料不唯一,否则可以食品和饮料可以跑一个二分图最大匹配。
构造图时需要满足每条源到汇的流是一头牛的最优选择(将牛,食品,饮料串起来,流量为1,最大流就是答案)。食品和饮料连的话对算牛的贡献没什么用,所以把牛放在中间:
- 每头牛拆成两个点 i , i ′ i,i' i,i′,连边 ( i , i ′ , 1 ) (i,i',1) (i,i′,1)。
- 食品向 i i i连, i ′ i' i′向饮料连。
- 为限制每种食品饮料都只用一次,那么源点向食品,饮料向汇点连上容量为1的边。
*JOJ2453Candy
选:2 不选:1 无法给糖果正确连边。
但是 选:1 不选:0:
- 直接 S S S向糖连容量为1的边,糖向每个喜欢它的小孩连容量为1的边。
- 每个小孩向 T T T连容量为 ⌊ B i 2 ⌋ \lfloor \dfrac{B_i}{2}\rfloor ⌊2Bi⌋的边。
最大流 w w w+总糖果数 n ≥ ∑ B i n\geq \sum B_i n≥∑Bi则有解。
ZOJ2760How Many Shortest Path
构造s到t的最短路径图(设 s → i s\to i s→i最短路为 d s i ds_i dsi, i → t i\to t i→t最短路为 d t i dt_i dti,图中仅保留 d s u + w ( u , v ) + d t v = m i n _ d i s ds_u+w(u,v)+dt_v=min\_dis dsu+w(u,v)+dtv=min_dis的边)。这样图中任意一条路径都是最短路。
直接让所有边容量为1的,跑最大流即可。
WOJ1124Football Coach
跟 n n n有关的比赛都让 n n n赢,其余考虑构图:
- S S S向与 n n n无关的比赛 i i i连边 ( S , i , 2 ) (S,i,2) (S,i,2), i i i向比赛双方均连一条容量为2的边。
- 每个队(除 n n n)连边 ( i , T , s c o r e n − s c o r e i − 1 ) (i,T,score_n-score_i-1) (i,T,scoren−scorei−1)。
判断是否满流即可。
SGU326Perspective
与上题类似。
*SGU438The Glorious Karlutka River =)
动态流问题:
在流量限制的基础上加入了时间限制。
构图按时间分层:
- 南岸看作源点,北岸看作汇点。
- 每块石头拆成两个点 i , i ′ i, i' i,i′,且 i → i ′ i\to i' i→i′连容量为 C i C_i Ci的边。再按时间将每块石头拆点,即每块石头在不同的时间点都有一组点表示。
- 所有能从南岸跳到的石头,从 S S S向其各时间点处连容量为 + ∞ +\infty +∞的边。所有能跳到北岸的石头,从其各时间点处向 T T T连容量为 + ∞ +\infty +∞的边。
- 任意两块距离 ≤ D \leq D ≤D 的石头,互相从时刻 t t t到 t + 1 t+1 t+1连容量为 + ∞ +\infty +∞的。
- 枚举时刻 t t t,并不断地往网络中加点表示当前时刻的石头,直到最大流等于总人数为止,此时的 t t t就是答案。
*SPOJ287Smart Network Administrator
每条从 k k k户人家中的第 i i i个出发到达 1 1 1的路径都可以看做网络中的一条 s − t s-t s−t流,考虑构图:
- 1 1 1看做汇点。源点向 k k k户人家均连一条容量为1的边。
- 对于每条街道 ( u , v ) (u,v) (u,v),连边 ( u , v , + ∞ ) , ( v , u , + ∞ ) (u,v,+\infty),(v,u,+\infty) (u,v,+∞),(v,u,+∞)。
跑最大流后,每条街道的流量表示有多少条不同人家的缆线经过了这条街道。
但此时求出的仅是最大流,而不能限制最大流量的边流量最小。
于是转成存在性问题:
二分无向边的容量上限 m i d mid mid,对于每条街道 ( u , v ) (u,v) (u,v),连边 ( u , v , m i d ) , ( v , u , m i d ) (u,v,mid),(v,u,mid) (u,v,mid),(v,u,mid),判断是否满流即可。
SPOJ962Intergalactic Map
从1到3无法限制要先经过2…
然而题面就是在欺骗人!
无向图从1到2再到3,和从2分别到1和3并没有区别。
直接最大流判断。
最小割
HOJ2634How to earn more
最大权闭合图&最小割
HOJ2713Matrix1
最大点权独立集问题。
转化成最小点权覆盖集。
将网格黑白染色,源点向每个黑点,每个白点向 T T T均连一条容量为 C i , j C_{i,j} Ci,j的边。黑点向相邻白点连一条容量为 + ∞ +\infty +∞的边,答案即 ∑ C i , j \sum C_{i,j} ∑Ci,j-最小割。
因为黑点与白点的边都为 + ∞ +\infty +∞,所以割中的边只可能与 S S S相连或 T T T相连,故最小割就是最小点覆盖。
POJ1815Friendship
每个点拆成入度和出度,跑最小割就是最少人数。
关键在于如何输出最小字典序的答案:
枚举删去 1 − n 1-n 1−n,如果最小割不变,说明该点不可能在最小割中,我们再把该点加入到网络中;否则记录该点是一个解并不再将其放回。
ZOJ2532Internship
先跑一次最大流。发现每条路径上的割限制着最大流量(将路径上割的容量+1,最大流也会+1)。
那么在残量网络中分别从源点汇点向外 b f s bfs bfs出所有经过残余容量 > 0 >0 >0的边可以到达的点。若边 ( u , v ) (u,v) (u,v)残余容量为 0 0 0且 S S S可达 u u u, v v v可达 T T T,则该边为一个解。
Ural1277Cops and Thieves
删掉最小割使得源汇点不连通,考虑构图:
- 匪窝看作 S S S,美术馆看作 T T T,其余点拆成两个点 i , i ′ i,i' i,i′分别表示入度和出度, i → i ′ i\to i' i→i′连一条容量为 R i R_i Ri的边。
- 所有无向边 ( u , v ) (u,v) (u,v), u ′ → v , v ′ → u u'\to v,v'\to u u′→v,v′→u分别连一条容量为 + ∞ +\infty +∞的边。
判断最小割是否 ≤ K \leq K ≤K即可。
*SPOJ839Optimal Marks
异或和明示拆位:
单独考虑每一位。问题转成了“二选其一”。
显然为0的在一起,1的在一起更优,代价就是01交接处的边,可以转成最小割(将图划分成两个点集)。
对于每个已标号的点,源点向所有该位为1的点连容量为 + ∞ +\infty +∞的边,所有该位为0的点向汇点连容量为 + ∞ +\infty +∞的边,原图中的边 ( i , j ) (i,j) (i,j)转成边 ( i , j , 1 ) (i,j,1) (i,j,1)。
最小割就是该位的代价。
在残余网络中从源点沿着残余容量 > 0 >0 >0的边向外 b f s bfs bfs,将所有到达的点该位标记为1即可。
(拆位很好想,但感觉这个最小割十分巧妙(没有提示的话很难想到))
*SPOJ1693Coconuts
与上一题类似。
同样也是尽量让相同意见的守卫在一起才最优。在上一题中是给一些点确定选择(0/1),而这一题中,是可以给一些点改变选择,那么建图出来后,相当于把点用1的代价划分到了另一边(也就是最小割可能割在与源汇点的连边上)。
S S S向所有赞同的守卫连一条流量为1的边,所有反对的守卫向 T T T连一条流量为0的边。朋友关系 ( i , j ) (i,j) (i,j)相当于无向边,则连边 ( i , j , 1 ) , ( j , i , 1 ) (i,j,1),(j,i,1) (i,j,1),(j,i,1)。
最小割就是答案:
若割边与 s , t s,t s,t相连,则表示违背自己意愿投票;否则是一对不同意见的朋友。
Beijing Regional 2008 Problem A Destroying the bus stations
与ZOJ 2760 How Many Shortest Path类似,先求出点 i i i和源点和汇点的最短路 d s i , d t i ds_i,dt_i dsi,dti。
d s i + d t i > k ds_i+dt_i>k dsi+dti>k的点无用,直接删去。图中仅保留 d s i + d t i ≤ k ds_i+dt_i\leq k dsi+dti≤k的点,考虑构图:
- 每个点拆成入度 i i i和出度 i ′ i' i′,连边 ( i , i ′ , 1 ) (i,i',1) (i,i′,1)(割边)
- 若边 ( u , v ) (u,v) (u,v)的 u , v u,v u,v都保留在图中,则连边 ( u ′ , v , + ∞ ) (u',v,+\infty) (u′,v,+∞)。
最小割就是答案。
*bzoj3438小M的作物
最小割的一类模型
此类问题常为两种选择,不同的选择会有不同的收益,同时某些组合特定的选择方式会有额外的收获。
也就是考虑选择某条边,哪些边必须割掉。
*有向图破坏 Destroying the Graph
ACM/ICPC Northeastern Europe (NEERC) 2003, Northern Subregion – D. Destroying the Graph
对于指定的一条边 ( u , v ) ∈ E (u,v)\in E (u,v)∈E,只有操作 a ( u ) a(u) a(u)或操作 b ( v ) b(v) b(v)可以将其删除掉,即操作 a ( u ) a(u) a(u)或操作 b ( v ) b(v) b(v)至少要有一个被执行。
将一个操作本身就看成是一个点,一条有向边看成是连接 2 个操作的边,即一个最小点权覆盖模型,考虑构图:
连边 ( S , u , a ( u ) ) , ( u ′ , T , b ( u ) ) , ( u , v , + ∞ ) (S,u,a(u)),(u',T,b(u)),(u,v,+\infty) (S,u,a(u)),(u′,T,b(u)),(u,v,+∞)。
答案即最小割。
对偶问题最大点独立集= ∑ w e − \sum w_e- ∑we−最小割
有上下界
【总结】有上下界网络流
POJ2396Budget
有源汇有上下界网络的可行流问题
费用流
HOJ2543Stone IV
凸费用流问题
只需将原图中的每条边 ( u , v ) (u, v) (u,v)拆成两条: ( u , v , C i , 0 ) , ( u , v , ∞ , E i ) (u, v, C_i, 0), (u, v, ∞, E_i) (u,v,Ci,0),(u,v,∞,Ei)即可。
最小费用流以及费用函数的凸性:
保证了拆分边后流一定会先充满费用较小的边,再流向费用较大的边,而这些费用的和正好等于流量为 x x x时的总费用,是正确的流。
HOJ2715Matrix3
同样考虑拆边&拆点(将第一次经过和之后区别开)构图:
- 将每个格子 i i i拆成入度 i i i和出度 i ′ i' i′, 并加边 ( i , i ′ , 1 , − v i ) (i, i', 1, -v_i) (i,i′,1,−vi), ( i , i ′ , ∞ , 0 ) (i, i', ∞, 0) (i,i′,∞,0), ( S , i , ∞ , 0 ) (S, i, ∞, 0) (S,i,∞,0)。
- 对相邻的格子j,若 H i > H j H_i > Hj Hi>Hj则加边 ( i ′ , j , ∞ , 0 ) (i', j, ∞, 0) (i′,j,∞,0)。
- 若格子 i i i在边界上则加边 ( i ’ , t , ∞ , 0 ) (i’, t, ∞, 0) (i’,t,∞,0)。
限制增广次数小于等于 K K K求最小费用流,并将总费用取负。
HOJ 2739 The Chinese Postman Problem
若原图不连通,或者存在某个点的入度或出度为 0 0 0则无解。
问题转化成增加图中一些有向边的经过次数,使得每个点入度=出度,且代价最小,考虑设原图中点 i i i入度-出度 = d i =d_i =di,考虑建图:
- 若 d i > 0 d_i>0 di>0,连边 ( S , i , d i , 0 ) (S,i,d_i,0) (S,i,di,0);若 d i < 0 d_i<0 di<0,连边 ( i , T , − d i , 0 ) (i,T,-d_i,0) (i,T,−di,0)。
- 原图中的有向边 ( i , j ) (i,j) (i,j)保留,转成连边 ( i , j , + ∞ , w ( i , j ) ) (i,j,+\infty,w(i,j)) (i,j,+∞,w(i,j))
答案就是最小费用流+原图边权和。
*POJ 3680 Intervals
注意是开区间。
先离散化端点,设离散化后分别为 1 − m 1-m 1−m,考虑构图:
- 连边 ( S , 1 , K , 0 ) , ( i , i + 1 , K , 0 ) ( 1 ≤ i < m ) , ( m , T , K , 0 ) (S,1,K,0),(i,i+1,K,0)(1\leq i<m),(m,T,K,0) (S,1,K,0),(i,i+1,K,0)(1≤i<m),(m,T,K,0)。
- 对于每个区间设其离散化后为 [ l , r ] [l,r] [l,r],则连边 ( l , r , 1 , − w ) (l,r,1,-w) (l,r,1,−w)(限制了起点在 ( l , r ) (l,r) (l,r)的连边的个数)
答案就是最小费用取反。
(好妙啊,相当于一个区间暂时占据了内部点的1个单位的流量)
SPOJ371Boxes
简单题,直接构图:
- 若 a i > 1 a_i>1 ai>1,连边 ( S , i , a i − 1 , 0 ) (S,i,a_i-1,0) (S,i,ai−1,0);若 a i = 0 a_i=0 ai=0,连边 ( i , T , 1 , 0 ) (i,T,1,0) (i,T,1,0)。
- 每个盒子 i i i向相邻两个盒子 j j j连边 ( i , j , + ∞ , 1 ) (i,j,+\infty,1) (i,j,+∞,1)
答案就是最小费用。
*BASHU2445餐巾问题
经典构图题,将每一天拆成两个点 i , i ’ i, i’ i,i’,加如下 6 条边:
- ( S , i , r i , p ) (S, i, r_i, p) (S,i,ri,p)——在第 i i i天可以买至多 r i r_i ri个餐巾,每块 p p p分;
- ( i , T , r i , 0 ) (i, T, r_i, 0) (i,T,ri,0)——第 i i i天要用 r i r_i ri块餐巾;
- ( S , i ′ , r i , 0 ) (S, i', r_i, 0) (S,i′,ri,0)——第 i i i天用剩的 r i r_i ri块旧餐巾;
- ( i ′ , i + m , ∞ , f ) (i', i+m, ∞, f) (i′,i+m,∞,f)——第 i i i天的旧餐巾送到快洗部,每块 f f f分;
- ( i ′ , i + n , ∞ , s ) (i', i+n, ∞, s) (i′,i+n,∞,s)——第 i i i天的旧餐巾送到慢洗部,每块 s s s分;
- ( i ′ , ( i + 1 ) ′ , ∞ , 0 ) (i', (i+1)', ∞, 0) (i′,(i+1)′,∞,0)——第 i i i天的旧餐巾可以留到第 i + 1 i+1 i+1天再处理;
注意这里是 i → T , S → i ′ i\to T,S\to i' i→T,S→i′而非 i → i ′ , i ′ → T i\to i',i'\to T i→i′,i′→T,因为 i → T i\to T i→T是为了保证每一天都用了 r i r_i ri块餐巾,但流向汇点的流量无法再用,而旧餐巾实际上可以回收利用,所以再连边 S → i ′ S\to i' S→i′。
所以6种边之间联系十分紧密,缺一不可。
答案就是最小费用。
*剪刀石头布
BZOJ2597: [Wc2007]剪刀石头布 -费用流&组合数学
总结
模型
- 最大流问题最好暴力建图,但模型多变且连边优化都很巧妙
- 最小割是最大流的对偶问题。
最小割常解决 D A G DAG DAG图论相关知识的模型转化问题:最大权闭合子图,最小点覆盖(需要熟悉这些模型)。
割的性质:不连通,两类点
- 动态流问题不断按时间拆点直到满流。
- 上下界网络流可以说是在其它网络流问题的一个拓展:多了一个流量上下界的限制(可以用固定的方式解决)。
- 费用流加上权值后变化最多,最难想,需要多见不同的题型。
构图
- 如果一时想不出很好的构图方法,可以先建立最直观的模型,不断简化。
- 构图思维必须严谨,保证不出现一个点可以流出超出限制范围的流量/构成不合法的状态(保证正确性),明确每条边,每个点的作用。
- 最大流问题常用一条 s − t s-t s−t流表示实际问题中的一种操作方案。
- 最小割: s − t s-t s−t割集表示方案;“二选其一”问题
用正无限容量排除不参与决策的边;使用割的定义式来分析最优性;利用与源或汇关联的边容量处理点权。
- 最小费用最大流:凸性(拆分边)
常见套路
- 分析数据范围:拆点(按时间分层),暴力枚举,最短路先跑 f l o y d floyd floyd。
- 二分限制,网络流作为判断工具(最大流满流)。
- 结合各类图论知识