网络流学习笔记#2:最小费用最大流和最小割树

文接网络流学习笔记#1:最大流和最小割

约定

c o s t ( u , v ) cost(u,v) cost(u,v) 表示 u u u v v v 的费用

费用流

定义

在一个流网络中,有源点和汇点 s , t s,t s,t,每条边都有一个容量和 , s s s 有无限的流量流向 t t t,在满足流量最大的前提下使得费用最小。

解法

这种情况下,找增广路不再可以找到答案,为什么呢?因为费用不一定最小,那怎么办?使用 SPFA!(为什么?有负权边呢) (也就是最小费用增广路)

114514年后的update:现在看自己当时真的是太naive了。。没想到居然有人看我的文章,本来都是写来自娱自乐的[捂脸]。

就经验而言,大多数题目不会考察选手对网络流算法的本质理解,所以这里只给出费用流的实现流程,并不严格证明:

首先对于原流网络的一条边 ( u , v , w , c ) (u,v,w,c) (u,v,w,c),建出 ( u , v , w , c ) (u,v,w,c) (u,v,w,c) ( v , u , 0 , − c ) (v,u,0,-c) (v,u,0,c),每次从源点 s s s 出发找一条费用最小的可行流(说人话,就是最短路上的每条边的流量都大于 0 0 0),然后使其满流(说人话,就是最短路上所有流量减去路径上流量最小者,然后反边相应更新。)直到找不到可行流。

费用流/最大流的核心是在建模,一些常见的模型将在学习笔记#3中讲到。这里因读者要求,先更新最小割树。

最小割树

在阅读下列内容之前最好先掌握 cdq 分治一类问题的解法。

先讲定义:

最小割树是原图一棵生成树,满足对于树上一条边 ( u , v ) (u,v) (u,v) ,如果在树上断开这条边所产生的两个集合和在图上断开这条边所产生的集合相同,并且 w ( u , v ) w(u,v) w(u,v) 等价于原图上 u u u v v v 之间的最小割。

如果在一张流网络上任选两个点作为源点汇点跑最小割,不难发现一定会将原图分为和 S 相连的集合和和 T 相连的集合(废话),如果再次对两个集合执行同样操作,一直递归下去,熟悉分治的话很容易能看出来这就是建出了一棵最小棵树,只跑了 O ( n ) O(n) O(n) 次最小割。

那么最小割有什么性质呢?

对于任意两点 x , y x,y x,y ,若以它们为源汇点跑最小割,其答案就是最小割树上 x , y x,y x,y 路径上边权最小者。

(下文中 c u t ( x , y ) cut(x,y) cut(x,y) 表示 ( x , y ) (x,y) (x,y) 之间的最小割, S x , S y S_x,S_y Sx,Sy 分别表示和 x x x 相连的集合以及和 y y y 相连的集合)

证明:换而言之是要证明 c u t ( x , y ) = c u t ( a , b ) ( a ∈ S x , b ∈ S y ) cut(x,y)=cut(a,b)(a\in S_x,b\in Sy) cut(x,y)=cut(a,b)(aSx,bSy)

对于证明二者相等有一个常见套路,比方说要证明 a = b a=b a=b ,可以证明 a ≥ b a\ge b ab 并且 a ≤ b a\le b ab

那么先来说明 c u t ( x , y ) ≥ c u t ( a , b ) ( a ∈ S x , b ∈ S y ) cut(x,y)\ge cut(a,b)(a\in S_x,b\in Sy) cut(x,y)cut(a,b)(aSx,bSy)。这个很显然,因为如果 c u t ( x , y ) < c u t ( a , b ) cut(x,y)< cut(a,b) cut(x,y)<cut(a,b),那 a , b a,b a,b 为啥不切 x , y x,y x,y 切的那帮东西呢?

再来说明 c u t ( x , y ) ≤ c u t ( a , b ) ( a ∈ S x , b ∈ S y ) cut(x,y)\le cut(a,b)(a\in S_x,b\in Sy) cut(x,y)cut(a,b)(aSx,bSy),这个我实在懒得打 LaTeX 了。。可以看看其他大佬的证明:https://www.luogu.com.cn/problem/solution/P4897。。。

由此可得 c u t ( x , y ) = c u t ( a , b ) cut(x,y)=cut(a,b) cut(x,y)=cut(a,b)。根据最小割树的定义, a , b a,b a,b 分别位于 x , y x,y x,y 当且仅当树上断掉 ( a , b ) (a,b) (a,b) 之后 ( x , y ) (x,y) (x,y) 不连通,因此 ( a , b ) (a,b) (a,b) 只能在树上 ( x , y ) (x,y) (x,y) 的路径上。因此 ( x , y ) (x,y) (x,y) 的最小割等于路径上边权最小点。

由此,我们通过了 n n n 次最小割即可求得全图任意两点的最小割。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值