文章目录
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) 的流量.
满足 :
- 容量限制 : ( 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)
- 流量平衡 : 对于非 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) u→x∑f(u,x)=x→u∑f(x,u).
- 斜对称性 : 对于边 ( 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 算法
无源汇有上下界可行流
在一张网络上 , 要求 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 l≤f(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 0≤f′(u,v)≤r−l 即为一般网络流形式
例如 :
根据流量平衡 , 有 :
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 的上限) , 方程有解.
[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) 的次数
-
容量限制 :
有 ∣ 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) -
流量平衡 :
对于非 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} ⎩ ⎨ ⎧u→x∑fa(u,x)=0u→x∑fb(u,x)=0x→u∑fa(x,u)=0x→u∑fb(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)
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) 1≤f(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
此时我们需要满足:
-
满足下界
我们参照无源汇上下界可行流的思想 , 记 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
为满足流量平衡 , 需要建超级源点和超级汇点 , 但此时已经有超级源点与超级汇点
-
最小化 ∑ s a \sum s_a ∑sa
考虑将 s a s_a sa 改写成 x − s a x-s_a x−sa 的形式 , 从而达到最小化的目的
例中 , 由于最小覆盖的要求 , s a > 3 s_a>3 sa>3 时显然会重复覆盖 , 不符合题意 , 得 s a ≤ 3 s_a\le 3 sa≤3 . 同理 , t a ≤ 2 t_a \le 2 ta≤2
我们记 s a ′ = 3 − s a s_a'=3-s_a sa′=3−sa , t a ′ = 2 − t a t_a'=2-t_a ta′=2−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 ′ ( 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 sa′≤outdega , t a ′ ≤ i n d e g a t_a' \le indeg_a ta′≤indega 的最大流
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
S→T 的边,有
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 u→v 与 v → u v \to u v→u 分别保证了 v v v 的意愿和 u u u 必须一样 以及 u u u 的意愿和 v v v 必须一样 , 否则就需要割边.
最大权值闭合子图模型
给定 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 之间的边不用割 , 即为选择的实验.
最大密度子图模型
密度 : 给定一张无向图 G ( V , E ) G(V,E) G(V,E) , 其密度定义为边数与点数的比值, ρ ( G ) = ∣ E ∣ ∣ V ∣ \rho(G)=\frac {|E|} {|V|} ρ(G)=∣V∣∣E∣ .
子图 : 在图 G G G 上选一些点 V ′ V' V′ , 集合 V ′ V' V′ 中各点连的边在 G G G 中存在的 , 组成 E ′ E' E′ , 则子图即为 G ′ ( V ′ , E ′ ) G'(V',E') G′(V′,E′) .
最密子图 : 子图中密度最大的子图.