约定
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 分治一类问题的解法。
先讲定义:
最小割树是原图一棵生成树,满足对于