网络流--最大流(思想)
今天学网络流
虽然以前学过。但是和没学没什么区别,当时那个讲课的NOI金牌选手的PPT倒是很好看
网络流定义不想写了
网络流分为最大流和费用流,常用于解决水流在管道中流动,数据在网络中流,电流在电线中流等问题,属于图论算法。
网络流的操作在一个有向图中进行,每条边有流量权值,是流过这条边的最大限制值。
若在这个水流图中出现了一条循环流动的水流,则这个水流必定满足下列条件:
(1) 流量约束条件:每条边流过的流量小于它的流量上限,即
我们称满足这两个条件的一个流方案,即使得每条边都满足流量约束,每个顶点满足流
量平衡的方案为一条无源汇网络的可行(循环)流。
最大流
定义源点s和汇点t,s的入度为0,出度为正无穷,t的出度为0,入度为正无穷
如何实现?
首先考虑贪心,把每条边的流量强制加到最大
那么
5->1 10
1->3 6
1->2 4
5->2 1
2->t 5
3->t 6
最大流为11
好像可以,但是因为有流量平衡的限制,所以加到最大极有可能会破坏流量平衡
那就加到满足流量平衡时尽量大的值行吗?
数据小的时候可以,但是流入一个点的流量改变会导致从这个点流出的各条边的流量改变,这样的话,每次求一个最大值就要遍历整个图,显然是不可行的。
那么我们怎么做呢?
我们把每条边的流退回去,简称退流,得到:
方法:(1) 只利用满足f(e)<c(e)的e 或f(e)>0 的e 的反向边 rev (e),寻找一条s到t的路径。
(2) 如果不存在满足条件的路径,则算法结束。否则,沿着该路径尽可能地增加流,返回(1)。
如何证明?参见:https://blog.****.net/wzw1376124061/article/details/71270835