【总结】网络流建模汇总-泛做&补充

网络流建模汇总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
  • 有上下界
    • POJ2396Budget
  • 费用流
    • 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(1i<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 n10,考虑枚举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 nBi则有解。


ZOJ2760How Many Shortest Path

构造s到t的最短路径图(设 s → i s\to i si最短路为 d s i ds_i dsi i → t i\to t it最短路为 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,scorenscorei1)

判断是否满流即可。


SGU326Perspective

与上题类似。


*SGU438The Glorious Karlutka River =)

动态流问题:
在流量限制的基础上加入了时间限制。

构图按时间分层:

  • 南岸看作源点,北岸看作汇点。
  • 每块石头拆成两个点 i , i ′ i, i' i,i,且 i → i ′ i\to i' ii连容量为 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 st流,考虑构图:

  • 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 1n,如果最小割不变,说明该点不可能在最小割中,我们再把该点加入到网络中;否则记录该点是一个解并不再将其放回。


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' ii连一条容量为 R i R_i Ri的边。
  • 所有无向边 ( u , v ) (u,v) (u,v) u ′ → v , v ′ → u u'\to v,v'\to u uv,vu分别连一条容量为 + ∞ +\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+dtik的点,考虑构图:

  • 每个点拆成入度 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 1m,考虑构图:

  • 连边 ( 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)(1i<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,ai1,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' iT,Si而非 i → i ′ , i ′ → T i\to i',i'\to T ii,iT,因为 i → T i\to T iT是为了保证每一天都用了 r i r_i ri块餐巾,但流向汇点的流量无法再用,而旧餐巾实际上可以回收利用,所以再连边 S → i ′ S\to i' Si

所以6种边之间联系十分紧密,缺一不可。

答案就是最小费用。


*剪刀石头布

BZOJ2597: [Wc2007]剪刀石头布 -费用流&组合数学


总结

模型

  • 最大流问题最好暴力建图,但模型多变且连边优化都很巧妙
  • 最小割是最大流的对偶问题。
    最小割常解决 D A G DAG DAG图论相关知识的模型转化问题:最大权闭合子图,最小点覆盖(需要熟悉这些模型)。
    割的性质:不连通,两类点
  • 动态流问题不断按时间拆点直到满流。
  • 上下界网络流可以说是在其它网络流问题的一个拓展:多了一个流量上下界的限制(可以用固定的方式解决)。
  • 费用流加上权值后变化最多,最难想,需要多见不同的题型。

构图

  • 如果一时想不出很好的构图方法,可以先建立最直观的模型,不断简化。
  • 构图思维必须严谨,保证不出现一个点可以流出超出限制范围的流量/构成不合法的状态(保证正确性),明确每条边,每个点的作用。
  • 最大流问题常用一条 s − t s-t st流表示实际问题中的一种操作方案。
  • 最小割: s − t s-t st割集表示方案;“二选其一”问题
    用正无限容量排除不参与决策的边;使用割的定义式来分析最优性;利用与源或汇关联的边容量处理点权。
  • 最小费用最大流:凸性(拆分边)

常见套路

  • 分析数据范围:拆点(按时间分层),暴力枚举,最短路先跑 f l o y d floyd floyd
  • 二分限制,网络流作为判断工具(最大流满流)。
  • 结合各类图论知识

你可能感兴趣的:(最短路,最大流最小割,费用流,上下界网络流)