浅谈网络流

本文介绍了网络流的基本概念,包括网络、流量、容量限制和流量平衡,并详细阐述了最大流问题,提出了EK算法。接着讨论了无源汇有上下界可行流的模型,以及如何转化为一般网络流问题。此外,文章还分析了网络流在危桥问题和DAG上的边覆盖问题中的应用,展示了如何构建模型并利用最大流算法解决这些问题。最后提到了最小割定理和二选其一模型,以及最大权值闭合子图和最大密度子图的建模方法。
摘要由CSDN通过智能技术生成

1. 网络流

网络

网络是一张单向图 , 每条边都有一个权值 c ( u , v ) c(u,v) c(u,v) 表示边 ( u , v ) (u,v) (u,v) 的容量. 特别的 , 图上有源点 ( s ) (s) (s) 和汇点 ( t ) (t) (t).

网络流

在一张网络上 , 从源点流出 , 最终流入汇点的流.

f ( u , v ) f(u,v) f(u,v) 表示 ( u , v ) (u,v) (u,v) 的流量.

满足 :

  1. 容量限制 : ( u , v ) (u,v) (u,v) 的流量不超过 ( u , v ) (u,v) (u,v) 的容量. 即 f ( u , v ) ≤ c ( u , v ) f(u,v)\le c(u,v) f(u,v)c(u,v)
  2. 流量平衡 : 对于非 s , t s,t s,t 的点 u u u 要求流入 u u u 的流量等于流出 u u u 的流量 , 即 ∑ u → x f ( u , x ) = ∑ x → u f ( x , u ) \sum\limits_{u\to x} f(u,x)=\sum\limits_{x\to u} f(x,u) uxf(u,x)=xuf(x,u).
  3. 斜对称性 : 对于边 ( u , v ) (u,v) (u,v) , 其反向边的流量为其相反数 . 即 f ( u , v ) = − f ( v , u ) f(u,v)=-f(v,u) f(u,v)=f(v,u)

在这里插入图片描述
( 图片来自 oi-wiki )

2. 网络流的应用

在此给出比较易懂的解释方式。

I. 最大流

在一张网络上 , 给定源点 s s s 汇点 t t t , 要求 f ( u , v ) ≤ c ( u , v ) f(u,v)\le c(u,v) f(u,v)c(u,v) , 求一条 s s s t t t 的最大流

题目

若边 ( u , v ) (u,v) (u,v) 满足 f ( u , v ) < c ( u , v ) f(u,v)<c(u,v) f(u,v)<c(u,v) 我们称这条边是有潜力的 , c ( u , v ) − f ( u , v ) c(u,v)-f(u,v) c(u,v)f(u,v) 称为这条边的潜力值

如果存在一条从 s s s t t t 的路径 , 该路径上的所有边都有潜力 , 我们可以将这条路径上的流增加这些边中最小的潜力值 , 同时将路径上的反向边减去该值 , 该操作称为增广.

可用 bfs 判断网络上是否存在可增广的路径.

核心代码即为

while( 可增广 )
	增广 ;

该算法称为 E K EK EK 算法

code


无源汇有上下界可行流

题目 / 题目

在一张网络上 , 要求 l ( u , v ) ≤ f ( u , v ) ≤ r ( u , v ) l(u,v)\le f(u,v)\le r(u,v) l(u,v)f(u,v)r(u,v) , 问是否存在可行流

l ≤ f ( u , v ) ≤ r l \le f(u,v) \le r lf(u,v)r , 记 f ′ ( u , v ) = f ( u , v ) − l f'(u,v)=f(u,v)-l f(u,v)=f(u,v)l

0 ≤ f ′ ( u , v ) ≤ r − l 0\le f'(u,v) \le r-l 0f(u,v)rl 即为一般网络流形式

例如 :

在这里插入图片描述

根据流量平衡 , 有 :
f ′ ( 1 , a ) + f ′ ( 2 , a ) + i n a = f ′ ( a , 3 ) + f ′ ( a , 4 ) + o u t a f'(1,a)+f'(2,a)+in_a=f'(a,3)+f'(a,4)+out_a f(1,a)+f(2,a)+ina=f(a,3)+f(a,4)+outa

i n a = l ( 1 , a ) + l ( 2 , a ) , o u t a = l ( 1 , a ) + l ( 2 , a ) in_a=l(1,a)+l(2,a), out_a=l(1,a)+l(2,a) ina=l(1,a)+l(2,a),outa=l(1,a)+l(2,a)

因此我们可以建立一个超级源点 ( s ) (s) (s) 与超级汇点 ( t ) (t) (t)

在这里插入图片描述

原方程 f ( 1 , a ) + f ( 2 , a ) = f ( a , 3 ) + f ( a , 4 ) f(1,a)+f(2,a)=f(a,3)+f(a,4) f(1,a)+f(2,a)=f(a,3)+f(a,4) 有解

当且仅当 f ′ ( 1 , a ) + f ′ ( 2 , a ) + i n a = f ′ ( a , 3 ) + f ′ ( a , 4 ) + o u t a f'(1,a)+f'(2,a)+in_a=f'(a,3)+f'(a,4)+out_a f(1,a)+f(2,a)+ina=f(a,3)+f(a,4)+outa 有解.

( s , a ) (s,a) (s,a) 的上限为 i n a in_a ina , ( a , t ) (a,t) (a,t) 的上限为 o u t a out_a outa . 根据上文最大流的代码 , 满足平衡条件的情况下保证了流量最大 , 因此如果最大流达到了所有 i n a in_a ina 的上限 (此时同样满足所有 o u t a out_a outa 的上限) , 方程有解.

记录
code


[CQOI2014]危桥

题目

我们记 f a ( u , v ) , f b ( u , v ) f_a(u,v),f_b(u,v) fa(u,v),fb(u,v) A , B A,B A,B 经过边 ( u , v ) (u,v) (u,v) 的次数

  1. 容量限制 :

    ∣ f a ( u , v ) ∣ + ∣ f b ( u , v ) ∣ ≤ c ( u , v ) |f_a(u,v)|+|f_b(u,v)|\le c(u,v) fa(u,v)+fb(u,v)c(u,v)

    等价于 { f a ( u , v ) + f b ( u , v ) ≤ c ( u , v ) f a ( u , v ) − f b ( u , v ) ≤ c ( u , v ) − f a ( u , v ) + f b ( u , v ) ≤ c ( u , v ) − f a ( u , v ) − f b ( u , v ) ≤ c ( u , v ) \begin{cases} f_a(u,v)+f_b(u,v)\le c(u,v) \\ f_a(u,v)-f_b(u,v)\le c(u,v) \\ -f_a(u,v)+f_b(u,v)\le c(u,v) \\ -f_a(u,v)-f_b(u,v)\le c(u,v) \end{cases} fa(u,v)+fb(u,v)c(u,v)fa(u,v)fb(u,v)c(u,v)fa(u,v)+fb(u,v)c(u,v)fa(u,v)fb(u,v)c(u,v)

    根据 f ( u , v ) = − f ( v , u ) f(u,v)=-f(v,u) f(u,v)=f(v,u) , c ( u , v ) = c ( v , u ) c(u,v)=c(v,u) c(u,v)=c(v,u) (双向边)

    等价于 { f a ( u , v ) + f b ( u , v ) ≤ c ( u , v ) f a ( u , v ) − f b ( u , v ) ≤ c ( u , v ) f a ( v , u ) − f b ( v , u ) ≤ c ( v , u ) f a ( v , u ) + f b ( v , u ) ≤ c ( v , u ) \begin{cases} f_a(u,v)+f_b(u,v)\le c(u,v) \\ f_a(u,v)-f_b(u,v)\le c(u,v) \\ f_a(v,u)-f_b(v,u)\le c(v,u) \\ f_a(v,u)+f_b(v,u)\le c(v,u) \end{cases} fa(u,v)+fb(u,v)c(u,v)fa(u,v)fb(u,v)c(u,v)fa(v,u)fb(v,u)c(v,u)fa(v,u)+fb(v,u)c(v,u)

    得对于任意边 ( u , v ) (u,v) (u,v) , 满足 :
    { f a ( u , v ) + f b ( u , v ) ≤ c ( u , v ) f a ( u , v ) − f b ( u , v ) ≤ c ( u , v ) \begin{cases} f_a(u,v)+f_b(u,v)\le c(u,v) \\ f_a(u,v)-f_b(u,v)\le c(u,v) \end{cases} {fa(u,v)+fb(u,v)c(u,v)fa(u,v)fb(u,v)c(u,v)

    f 1 ( u , v ) = f a ( u , v ) + f b ( u , v ) f_1(u,v)=f_a(u,v)+f_b(u,v) f1(u,v)=fa(u,v)+fb(u,v) ,

    f 2 ( u , v ) = f a ( u , v ) − f b ( u , v ) f_2(u,v)=f_a(u,v)-f_b(u,v) f2(u,v)=fa(u,v)fb(u,v)

    即对于任意边 ( u , v ) (u,v) (u,v) , 满足 :
    { f 1 ( u , v ) ≤ c ( u , v ) f 2 ( u , v ) ≤ c ( u , v ) \begin{cases} f_1(u,v)\le c(u,v) \\ f_2(u,v)\le c(u,v) \end{cases} {f1(u,v)c(u,v)f2(u,v)c(u,v)

  2. 流量平衡 :

    对于非 a 1 , a 2 , b 1 , b 2 a_1,a_2,b_1,b_2 a1,a2,b1,b2 的点 u u u , 在考虑正向边以及反向边的情况下有

    { ∑ u → x f a ( u , x ) = 0 ∑ u → x f b ( u , x ) = 0 ∑ x → u f a ( x , u ) = 0 ∑ x → u f b ( x , u ) = 0 \begin{cases} \sum\limits_{u\to x} f_a(u,x) = 0\\ \sum\limits_{u\to x} f_b(u,x) = 0\\ \sum\limits_{x\to u} f_a(x,u) = 0\\ \sum\limits_{x\to u} f_b(x,u) = 0 \end{cases} uxfa(u,x)=0uxfb(u,x)=0xufa(x,u)=0xufb(x,u)=0

    而对于 a 1 , a 2 , b 1 , b 2 a_1,a_2,b_1,b_2 a1,a2,b1,b2 , 有 :
    (图中的 ∑ \sum 表示流出某个点的流量 ∑ f \sum f f)

    在这里插入图片描述

    因此 , 对于 f 1 f_1 f1 :

    我们可建立超级源点 s s s a 1 , b 1 a_1,b_1 a1,b1 容量分别为 2 a n , 2 b n 2a_n,2b_n 2an,2bn 的边 ,
    建立 a 2 , b 2 a_2,b_2 a2,b2 与超级汇点 t t t 容量分别为 2 a n , 2 b n 2a_n,2b_n 2an,2bn 的边.

    对于 f 2 f_2 f2 :

    我们可建立超级源点与 a 1 , b 2 a_1,b_2 a1,b2 容量分别为 2 a n , 2 b n 2a_n,2b_n 2an,2bn 的边,
    建立 a 2 , b 1 a_2,b_1 a2,b1 与超级汇点 t t t 容量分别为 2 a n , 2 b n 2a_n,2b_n 2an,2bn 的边.

f 1 , f 2 f_1,f_2 f1,f2 分别跑最大流 , 计算出最大流是否能达到 ( 2 a n + 2 b n ) (2a_n+2b_n) (2an+2bn)

code


DAG上的边覆盖问题

题目

f ( u , v ) f(u,v) f(u,v) 表示经过边 ( u , v ) (u,v) (u,v) 的次数.

题目要求对于所有边 ( u , v ) (u,v) (u,v) , 1 ≤ f ( u , v ) 1\le f(u,v) 1f(u,v) .

但对于一个点 a a a , 不一定满足流量平衡 , 例如 :
在这里插入图片描述

每条边恰好经过一次是一种可行方案 , 但此时不满足流量平衡.

我们参考上文的思路 , 建超级源点与超级汇点 , 使其达到流量平衡 :

f ( 1 , a ) + f ( 2 , a ) + s a = f ( a , 3 ) + f ( a , 4 ) + f ( a , 5 ) + t a f(1,a)+f(2,a)+s_a=f(a,3)+f(a,4)+f(a,5)+t_a f(1,a)+f(2,a)+sa=f(a,3)+f(a,4)+f(a,5)+ta

此时我们需要满足:

  1. 满足下界

    我们参照无源汇上下界可行流的思想 , 记 f ′ ( u , v ) = f ( u , v ) − 1 f'(u,v)=f(u,v)-1 f(u,v)=f(u,v)1

    例中即 f ′ ( 1 , a ) + f ′ ( 2 , a ) + s a + 2 = f ′ ( a , 3 ) + f ′ ( a , 4 ) + ′ f ( a , 5 ) + t a + 3 f'(1,a)+f'(2,a)+s_a+2=f'(a,3)+f'(a,4)+'f(a,5)+t_a+3 f(1,a)+f(2,a)+sa+2=f(a,3)+f(a,4)+f(a,5)+ta+3

    为满足流量平衡 , 需要建超级源点和超级汇点 , 但此时已经有超级源点与超级汇点

  2. 最小化 ∑ s a \sum s_a sa

    考虑将 s a s_a sa 改写成 x − s a x-s_a xsa 的形式 , 从而达到最小化的目的

例中 , 由于最小覆盖的要求 , s a > 3 s_a>3 sa>3 时显然会重复覆盖 , 不符合题意 , 得 s a ≤ 3 s_a\le 3 sa3 . 同理 , t a ≤ 2 t_a \le 2 ta2

我们记 s a ′ = 3 − s a s_a'=3-s_a sa=3sa , t a ′ = 2 − t a t_a'=2-t_a ta=2ta , 此时 :

f ′ ( 1 , a ) + f ′ ( 2 , a ) − s a ′ = f ′ ( a , 3 ) + f ′ ( a , 4 ) + ′ f ( a , 5 ) − t a ′ f'(1,a)+f'(2,a)-s_a'=f'(a,3)+f'(a,4)+'f(a,5)-t_a' f(1,a)+f(2,a)sa=f(a,3)+f(a,4)+f(a,5)ta

− f ′ ( 1 , a ) − f ′ ( 2 , a ) + s a ′ = − f ′ ( a , 3 ) − f ′ ( a , 4 ) − ′ f ( a , 5 ) + t a ′ -f'(1,a)-f'(2,a)+s_a'=-f'(a,3)-f'(a,4)-'f(a,5)+t_a' f(1,a)f(2,a)+sa=f(a,3)f(a,4)f(a,5)+ta

根据 f ( u , v ) = − f ( v , u ) f(u,v)=-f(v,u) f(u,v)=f(v,u)

f ′ ( a , 1 ) + f ′ ( a , 2 ) + s a ′ = f ′ ( 3 , a ) + f ′ ( 4 , a ) + ′ f ( 5 , a ) + t a ′ f'(a,1)+f'(a,2)+s_a'=f'(3,a)+f'(4,a)+'f(5,a)+t_a' f(a,1)+f(a,2)+sa=f(3,a)+f(4,a)+f(5,a)+ta

此时满足流量平衡 , 只是所有原图的边都起点变终点 , 终点变起点

∑ s a ′ , ∑ t a ′ \sum s_a',\sum t_a' sa,ta 最大时 , ∑ s a , ∑ t a \sum s_a,\sum t_a sa,ta 最小

问题即化为 , 满足 s a ′ ≤ o u t d e g a s_a' \le outdeg_a saoutdega , t a ′ ≤ i n d e g a t_a' \le indeg_a taindega 的最大流

code


II. 最小割

:
一张网络 G ( V , E ) G(V,E) G(V,E) 上的一种点的划分方式:将 V V V 划分为集合 S , T S,T S,T , 其中 S + T = V S+T=V S+T=V ,源点 s s s 在集合 S S S 之中,汇点 t t t 在集合 T T T 之中

割的容量 :
我们定义割 ( S , T ) (S,T) (S,T) 的容量 c ( S , T ) c(S,T) c(S,T) 表示所有 S S S T T T 边的容量之和

我们同样可以理解为 : 割掉一些边 , 使得没有路径能从源点走到汇点 , 割掉边的花费即为割的容量.

其中使得割容量最小的割称为最小割

在这里插入图片描述

如上图中,割的容量为 20 + 20 + 20 20+20+20 20+20+20


最小割最大流定理

最小割等于最大流

证明 :

所有流 ≤ 所有割 \text{所有流} \le \text{所有割} 所有流所有割
对于一个割,任意流都会经过 S → T S \to T ST 的边,有 f ( s , t ) = S出边流量和 − S入边流量和 ≤ c ( S , T ) f(s,t)=\text{S出边流量和}-\text{S入边流量和} \le c(S,T) f(s,t)=S出边流量和S入边流量和c(S,T) , 那么就 所有流 ≤ 所有割 \text{所有流} \le \text{所有割} 所有流所有割

在这里插入图片描述
如果 某个流 = 某个割 \text{某个流} = \text{某个割} 某个流=某个割 ,那么这个流一定是最大流,这个割一定是最小割


二选其一模型

物品 i i i 放在 A A A 花费 a i a_i ai , 放在 B B B 花费 b i b_i bi . 对于特殊的 u , v u,v u,v , 若在不在同一个集合 , 额外花费 w w w . 求最小花费.

对于问题的建模 : 我们将 i i i 与虚拟源点 s s s a i a_i ai , i i i 与虚拟汇点 t t t b i b_i bi . 对于 u , v , w u,v,w u,v,w , 连 u , v u,v u,v 间容量为 w w w 的双向边.

此时, 每个割都对应一个方案.

证明:

首先, 对于一个物品, 要么与 s s s 有边, 表示放在 A A A 集合; 要么与 t t t 有边, 表示放在 B B B 集合.

而对于有限制的物体 i , j i,j i,j , 如果 i , j i,j i,j 不在一个集合, 此时 i , j i,j i,j 间的边一定需要被割 , 不然存在 s s s t t t 到路径, 不符合割的定义. 此时这条被割的边就表示的是不在一个集合的额外收益损失.

因此, 割的容量就对应着一种方案, 最小割即为答案.

[SHOI2007] 善意的投票

题目

本题关键在于抽象建模 : 将 0,1 作为源点与汇点 , 每个人与源点 / 汇点建单向边 , 朋友 ( u , v ) (u,v) (u,v) 间建双向边 , 即化为最小割问题.

正确性 : 割一个点与源点或汇点之间的边即违背自身意愿. 双向边 u → v u \to v uv v → u v \to u vu 分别保证了 v v v 的意愿和 u u u 必须一样 以及 u u u 的意愿和 v v v 必须一样 , 否则就需要割边.

code


最大权值闭合子图模型

题目

给定 n n n 个实验 , m m m 个仪器 , 每个实验 i i i 都有一些对应需要的仪器. 购买仪器需要花费 , 做实验获得收益. 问最大收益.

把 不做实验 和 购买仪器 看作是损失 , 相当于问最小损失.

建模 :
将仪器与虚拟源点 s s s 相连 , 边权容量设为仪器花费 .
将实验与虚拟汇点 t t t 相连 , 边权容量设为实验收益 .
将仪器与实验之间的边边权容量设为 + ∞ +\infin + .

割仪器与 s s s 的边表示购买买这个仪器.
割实验与 t t t 的边表示不做这个实验.
最小割 , 不可能会割仪器与实验间的边.

方案:

从源点开始 dfs , 每次走残量大于 0 的边 , 得到所有集合 S S S 中的点.

如果仪器不属于 S S S , 即属于 T T T , 说明仪器与 s s s 之间的边需要割 , 即为购买的仪器.

而如果实验不属于 S S S , 即属于 T T T , 说明实验与 t t t 之间的边不用割 , 即为选择的实验.

code


最大密度子图模型

密度 : 给定一张无向图 G ( V , E ) G(V,E) G(V,E) , 其密度定义为边数与点数的比值, ρ ( G ) = ∣ E ∣ ∣ V ∣ \rho(G)=\frac {|E|} {|V|} ρ(G)=VE .

子图 : 在图 G G G 上选一些点 V ′ V' V , 集合 V ′ V' V 中各点连的边在 G G G 中存在的 , 组成 E ′ E' E , 则子图即为 G ′ ( V ′ , E ′ ) G'(V',E') G(V,E) .

最密子图 : 子图中密度最大的子图.

III. dinic 算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值