最大流-最小割 MAXFLOW-MINCUT ISAP

  简单的叙述就不必了。

  对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边。

  反向边的正确性:

    我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明。

    但事实上,我们不难理解,对于每条反向边,我们流过它相当于撤销了一条正向边的流量。

    并且它是必须的:

    

    而且从理论上,我们在加入反向边之后得到的最大流,我们从残余网络考虑。

    我们要认识到,反向边不会使最大流流量减少,这是很显然的。有flow<=flow‘。

    接下来我们考虑所有点的流量是否可以只用正向边得到。

    并且我们考察汇点,由于汇点没有出边,所有的反向边都是从它离开的,那么显然不会对汇点造成影响。

    对于其他点,我们考虑一条反向边的容量取决于正向边的流量,及总有flow_positive=capacity_negative,

    或者换一个说法,flow_positive=-flow_negative。

    也就是说,如果从这个点出去的流是通过u->v这条反向边出去的,这个流流向k,那么必然有相同流量的流从v->u,

    那么不如直接从v->k好了。(如果这个u->v->k包含其他反向边,那么就递归下去讨论,但问题规模减少。)

    这样就意识流的证明完了。

  最大流最小割定理:

    有一种普遍的证法,首先任意可行流的流量不可能大于任意一种割。即有最小割>=任意可行流。

    并且由于最大流算法,最大流的得出来的残余网络源点、汇点必然不连通,否则最大流可以更大(沿着联通的路径流过去可以更大)。

    这个时候最大流算法得到了其中一个割。

    即有最大流>=最小割。

    所以有最大流=最小割。

  要找到最大流,我们有一个非常直观的想法,不断的在残余网络中找S-T的路径,如果找到就流过去,流量自然而然的+1,这些便流量减少。

  这就是简易的Fold-Fulkerson算法,它是正确的。

  Fold-Fulkerson FF算法正确性证明:

    首先FF算法能够得到一个割,上面我们证明了割的容量总大于任意的流量,那么FF得到的流显然就是最大流了。

  在FF算法上,根据最短路的性质,可以证明每次根据残余网络的最短路径的可行路径流过去可以达到O(V^2E)的算法复杂度

——EK算法

  EK算法可以说是第一个SAP(Shortest Augment Path 最短增广路径)算法,在这之后的dinic只是一种扩展。

  事实上,在学习了之后,可以发现dinic和ISAP实际上十分相似。

  理论上ISAP是加了更多优化的。

  在利用预标号的技术后,ISAP应该是不会劣于Dinic的。但事实上poi的kos和NOI的海拔都使ISAP跪掉了(听说?)

  不过我觉得很有可能是写搓了。

  特别要注意,在分层图上,预标号是必需的。

  比如bzoj1001的狼抓兔子(本人ISAP跑了1200ms)中,如果不加预标号,一定是跑不过的。

  但加了之后,比dinic快2/3,并且比一些转了最短路的算法都要快一点。

Reference:

  1. https://tadvent.wordpress.com/2009/04/07/usaco-4-2-1-ditch-%E7%BD%91%E7%BB%9C%E6%9C%80%E5%A4%A7%E6%B5%81%E9%97%AE%E9%A2%98%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/
  2. http://www.cs.yale.edu/homes/aspnes/pinewiki/MaxFlow.html
  3. https://en.wikipedia.org/wiki/Maximum_flow_problem
  4. http://blog.csdn.net/qq_21110267/article/details/43540483
时间: 2024-08-11 07:35:50

最大流-最小割 MAXFLOW-MINCUT ISAP的相关文章

zoj3792--Romantic Value(最大流+最小割,求解割边)

Romantic Value Time Limit: 2 Seconds      Memory Limit: 65536 KB Farmer John is a diligent man. He spent a lot of time building roads between his farms. From his point of view, every road is romantic because the scenery along it is very harmonious an

ISAP 最大流 最小割 模板

虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> #include<iostream> #include<algorithm> #define ll long long using namespace std; #define REP( i , a , b ) for ( int i = a ; i < b ; ++ i ) #d

UVA 11248 Frequency Hopping (最大流+最小割)

题意:与正常的网络流一样,不过给定的第一行的最后一个数C的意思是能能否在给定的图里求出修改某一条边或者不修改某一条边是的这个图的流变成C,如果没修改就能有C,那么输出possible,通过修改能得到C输出possible+能修改的边集合,否则输出no possible 思路:(自己的是死暴力方法,直接爆了,想了很多法子都来不起,最后参照白书的思路来起了)可以先求出最大流,然后求出最小割里的弧,依次修改最小割里的弧,看能求出的最大流是否大于C PS:不优化的话很容易超时,第一个优化是把第一次求得得

最大流, 最小割问题及算法实现

最大流(MaxFlow)问题 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 想象一条多条不同水流量的水管组成的网络, s为供水广, t为水用户, 最大流问题就是找到能够在s到t流通的最大水流量 一个流是最大流当且仅当其残存网络不包含任何增广路径(里面的名称在后面有详细解释) 流(Flow)的基本性质 设$C_{uv}$代表边u到v最大允许流量(Capacity), $f

hdu 3987 Harry Potter and the Forbidden Forest【网路流最小割模型】

Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1549    Accepted Submission(s): 528 Problem Description Harry Potter notices some Death Eaters try to slip

【图割】opencv中构建图和最大流/最小割的源码解读

#include <vector> using namespace std; #define MIN(a,b) (((a)<(b))?(a):(b)) typedef unsigned char uchar; template <class TWeight> class GCGraph { public: GCGraph(); GCGraph(unsigned int vtxCount, unsigned int edgeCount); ~GCGraph(); void cr

bzoj1412-网络流最小割

狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆.可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已.所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养. 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变

UVA-11248 Frequency Hopping (最大流+最小割)

题目大意:给一张网络,问是否存在一条恰为C的流.若不存在,那是否存在一条弧,使得改动这条弧的容量后能恰有为C的流? 题目分析:先找出最大流,如果最大流不比C小,那么一定存在一条恰为C的流.否则,找出最小割集,然后枚举每一条弧改动其容量,看是否存在恰为C的流. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<string> # include<vector>

【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash

4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 20  Solved: 11[Submit][Status][Discuss] Description 你被雇佣升级一个旧果汁加工厂的橙汁运输系统.系统有管道和节点构成.每条管道都是双向的,且每条管道的流量都是1升每秒.管道可能连接节点,每个节点最多可以连接3条管道.节点的流量是无限的.节点用整数1到n来表示.在升级系统之前,你需要对现有