网络流之最大流算法

最大流

网络流的定义:

在一个网络(有流量)中有两个特殊的点,一个是网络的源点(s),流量只出不进,一个是网络的汇点(t),流量只进不出。

最大流:就是求s-->t的最大流量

假设 u,v 两个点,连接这两个点的边为e(u,v);

对于每一条边都有一个实际流量f(u,v),还有一个容量c(u,v),就是这条边上可以通过的最大流量。

当一条边的容量c(u,v)=0,证明这条边是不存在的,

作为一个合格的网络流,必须满足三个条件:

1>每条边的实际流量小于等于容量  f(u,v)<=c(u,v);

2>f(u,v)=-f(v,u);

3>对于不是源点和汇点的点,流入的流量等于流出的流量

如何来求一个网络的最大流:

如图是一个网路流,很明显看出答案是4。

我们要求s-t的流量,我们可以选择这样来求解,我们先从s点出发,找到一条s-t的路径,记录这条路径上那个最小的实际流量,

算法就是我们要找到很多条这样的路径,但这些路径都应该是不同的,所有我们只需要把这多条路径的的最小流量相加 得到就是最大流、

这个寻找s-t的路径也叫做增广路算法

其实这里困难的就是如何保证这些路径是不会相同的 这是涉及到一个概念 就是残留网络

残留网络就是每次利用增广路算法找到这条路径的最小实际流量 minn,我们在原网络中把这条边的容量都减去minn,所以必定这条路径中一定会有流量为0。

所有下次增广的话,就一定不会走原路 因为你的流量有0,走是没有意义的

时间: 2024-10-07 20:34:34

网络流之最大流算法的相关文章

(转) 网络流之最大流算法(EdmondsKarp)

求网络流有很多算法,这几天学习了两种,记录一下EK算法. 首先是网络流中的一些定义: V表示整个图中的所有结点的集合.E表示整个图中所有边的集合.G = (V,E) ,表示整个图.s表示网络的源点,t表示网络的汇点.对于每条边(u,v),有一个容量c(u,v)   (c(u,v)>=0),如果c(u,v)=0,则表示(u,v)不存在在网络中.相反,如果原网络中不存在边(u,v),则令c(u,v)=0.对于每条边(u,v),有一个流量f(u,v). 一个简单的例子.网络可以被想象成一些输水的管道.

网络流求最大流算法

一.网络流的定义:有向图G=(V,E)中,点集中有一源点S,一汇点T.且S入度为0,T出度为0.对于每条边edge,都有一权值函数c,表示其容量,一权值函数f,表示其实际流量. 满足对于任意一条边都有f(edge)<=c(edge). 二.最大流的定义:在不违背网络流的定义下,S到T的最大流量. 三.増广路的思想. 我们先考虑一个网络流:红色数字表示实际流量,蓝色表示边的容量,黄色表示更优的流量. 这个流从S到T的流量是5,但其显然不是最优的. 这个流比上面那个优,而且事实上,这个流就是当前网络

【网络流】最大流最简单的Ford-Fulkerson算法

Ford-Fulkerson算法是一个非常好理解的算法.大概是这样子的: ①不断从起点开始dfs 找一个通向终点的路.如果一条都找不到了,那么当前的值就是最大流 ②如果还存在着通向终点的路,那么加上它的最短的一截,然后做出图的残余图.继续. 下面是基于邻接矩阵的Ford-Fulkerson最大流算法.简单易懂,老少皆宜. #include <iostream> #include <cstdio> #include <cstring> #include <cmath

最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明

Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y:x) int pre[105],q[105]; int F[105][105]; int n,nc,np,m,s,t,all; int MaxFlow(int s, int t){ int ans=0; while(1){ memset(pre,0,sizeof(pre)); int head=0,tail=

HDU 3468 Treasure Hunting(BFS+网络流之最大流)

题目地址:HDU 3468 这道题的关键在于能想到用网络流.然后还要想到用bfs来标记最短路中的点. 首先标记方法是,对每一个集合点跑一次bfs,记录所有点到该点的最短距离.然后对于任意一对起始点来说,只要这个点到起点的最短距离+该点到终点的最短距离==起点到终点的最短距离,就说明这点在某条从起点到终点的最短路上. 然后以集合点建X集,宝物点建Y集构造二分图,将从某集合点出发的最短路中经过宝物点与该集合点连边.剩下的用二分匹配算法或最大流算法都可以.(为什么我的最大流比二分匹配跑的还要快....

有上下界的、有多组源汇的、网络流、费用流问题

先默认读者有基础的网络流以及费用流的知识前置 1.有上下界无源点汇点的可行流问题: 在本文中指: 原图中没有任何一个点可以凭空产生流量,亦没有任何一个点可以凭空消灭流量: 存在边既有流量上界又有流量下界: 求每条边流量的一组可行解: 满足每个点的入流量等于出流量: 由题意可见本题的图中有环,于是此类问题也被称作循环流: 这里给出的解法是将本题转换为一道普通的有上界最大流问题: 修改本题原图中每条边的流量下界为0,上界为原上界-原下界: 视为该边现在已经拥有了等同于该边流量下界的基础流量了, 然而

最大流算法和理论的简单理解

我退坑很久了,这篇文章不是因为刷OJ而写的总结,毕竟菜鸡老年人, 23333 之前我学网络流看的是算法书和别人的博客然后就开始套板子,而这次因为考试不得已把课本上的定理都看了一遍,瞬间对最大流算法更加清楚了. 1.定义 在学习网络流算法前要了解的一些知识. 1.对于一个有向的网络$G=(N, A, C)$,其中的$c_{i,j}$表示弧$(i,j)\in A$的容量,并设$s,t$为发点和收点,令$$x_{i,j}=通过弧(i,j)的流量$$2.对于一个满足流量限制的流量称之为可行流,其中限制条

POJ 1087 A Plug for UNIX(网络流之最大流)

题目地址:POJ 1087 不知道是谁把这题化为了二分最大匹配的专题里..于是也没多想就按照二分图的模型来建的(虽然当时觉得有点不大对...).后来发现二分最大匹配显然不行..有权值..直接来个最大流多方便..然后一直WA..后来仔细想了想..这根本就不能建二分图啊....这题跟二分图一点关系都没有.... 这题的建图思路是让源点与每一个设备的插座类型连边,让汇点与每一个插座连边.然后用floyd判断该设备能否通过转换转换成可以插的插座上.只要可以转换成的就连边,权值为INF.然后求一次最大流,

NEU 1458 方格取数(网络流之费用流)

题目地址:NEU 1458 跟杭电上的那两个方格取数不太一样..这个可以重复,但是取和的时候只能加一次.建图思路基本一会就出来.同样的拆点,只不过这题需要再拆个边,其中一条费用0,另一条费用为那个点处的值.流量都限制为1.然后剩下的都跟杭电上的那两个差不多了.因为把数组开小了WA了好几发..(我前面居然还专门检查了一下数组大小,居然当时还认为没开小...对自己无语..) 代码如下: #include <iostream> #include <stdio.h> #include &l