算法9-3:最大流和最小切割的理论

本章节介绍最大流问题和最小切割问题的关系。其实这两个问题是等价的。

现在把一个网络分成A和B两个部分,我们定义A到B的净流量交叉(Net flow across)就是从A到B的最大流量减去从B到A的最大流量。

接下来介绍流量值定理(Flow-value lemma)。令f为网络中任何一个流,令(A,B)为网络的任何一种切割方法,那么(A,B)的净流量交叉就等同于f的流量值。下图展示了流量值定理。

通俗的解释一下吧。首先将网络切割两个部分A和B,那么AB之间的流量就是从A到B的总流量减去从B到A的总流量。

最小切割问题中的最小流量指的是上述流量值定理中的流量。

最小切割问题可以转换成最大流问题。也就是说可以从最大流图中计算最小切割。计算步骤是这样的。首先从原点S出发,将容量已满的正向路径和容量为空的反向路径看成障碍,从原点出发,将所有能到达的顶点进行遍历。最后这些能到达的顶点就是最小切割。

算法9-3:最大流和最小切割的理论

时间: 2024-11-04 20:12:19

算法9-3:最大流和最小切割的理论的相关文章

算法9-1:最大流和最小切割问题

最小切割问题 首先介绍什么是切割.切割就是将一张图中的顶点分成两部分A和B. 接下来介绍一下什么是容量.容量是A区到B区所有的边权重之和. 最小切割就是求一张图中使得容量最小的切割方式. 最小切割的应用 最小切割在国家的拆分时会用到.著名的苏联解体事件就是通过计算最小切割来实现国家的拆分.在建模的时候将城市作为图论中的顶点,将铁路作为顶点之间的边.最后通过计算最小切割来界定国家界线. 最大流问题 最大流就是从顶点s到顶点t,经过所有的边,网络所能支撑的最大流量.下图中顶点t从三个方向接收流量,它

算法9-6:最大流的应用

最大流算法在现实生活中有着广泛的应用,从数据挖掘到图像处理,都有应用.现实生活中很多事物看起来是不相干的,而实际上只要通过数学建模,其实很多问题本质上都是一样的. 这里举的一些例子很多都是没办法第一眼就看出来,首先要理解最大流算法的模型,其次就是将现实生活中的问题转换成最大流问题从而进行求解. 二分图匹配问题 大学即将毕业了,很多童鞋要去找工作.现在有5个童鞋ABCDE,他们分别投了很多简历,录取情况如下: 阿里录取了A B C 腾讯录取了A B D E 百度录取了C 网易录取了A C 新浪录取

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

算法9-4:最大流算法复杂度分析

前面一节介绍了Ford-Fulkerson算法.那么这个算法是否一定能够在有限步骤内结束?要多少步骤呢? 这个问题的答案是,该算法确实能够在有限步骤之内结束,但是至于需要多少步骤,就要仔细分析. 为了分析问题,需要假定图中所有边的容量都是整数.但是有个严重的问题,比如下图中,如果使用Ford-Fulkerson算法,需要迭代200次才能结束. 首先将所有边的容量都初始化为0. 第一次迭代和第二次迭代之后,两条边各增加了1. 到最后200次迭代之后整个算法才结束. 这还不算最坏的情况.因为整数最多

算法9-5:最大流算法的Java代码

残留网络 在介绍最大流算法之前先介绍一下什么是残留网络.残余网络的概念有点类似于集合中的补集概念. 下图是残余网络的例子.上面的网络是原始网络,下面的网络是计算出的残留网络.残留网络的作用就是用来描述这个网络中还剩下多少可以利用的流量. 流量网络 最大流算法比以前介绍的算法都要复杂.网络中的每一条边需要记录容量和当前流量.容量是固定值,是已知条件,而当前流量在计算过程中会一直发生变化.因此,需要建立一个专门的类,用于最大流算法. public class FlowEdge { private i

hdu 4494 Teamwork (可行流的最小流)

去年通话邀请赛的B题,当时竟然过的那么少...明明是一道很裸的可行流最小流麽..只要对每种人分别求一下可行最小流加起来就可以了.建图是对每个点拆点,容量上下届都设为v[i],然后每个点间能连边的直接连边就可以了.然后在这个图的基础上转化为可行流最小流,求一下就可以了... #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<cstdio&g

算法9-2:最大流Ford-Fulkerson算法

本节介绍最大流算法的基本思想. 首先将整个网络的最大容量都设为0. 然后增加第一条边的流量,达到最大流量. 增加第二条边的流量,达到最大流量. 增加第三条边的流量,达到最大流量.这里需要注意的是,图中有一条反向的边(称之为后向弧).后向弧的作用就是说,可以将后向弧中的流量移动到别的线路中,这样可以增加更多的流量. 同样的,在第四条边中也有反向弧,通过反向弧增加更多的流量. 算法结束的依据是判断所有的路径都达到下列任意条件: 容量已经满了 反向弧是空的 这就是Ford-Fulkerson算法的基本

hdu 3315 My Brute 费用流,费用最小且代价最小

很常见的想法了= = #include <stdio.h> #include <iostream> #include <string.h> using namespace std; const int N=400; const int MAXE=200000; const int inf=1<<30; int head[N],s,t,cnt,n,m,ans; int d[N],pre[N]; bool vis[N]; int q[MAXE]; int V[N

POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]

妖怪题目,做到现在:2017/8/19 - 1:41-- 不过想想还是值得的,至少邻接矩阵型的Dinic算法模板get√ 题目链接:http://poj.org/problem?id=1815 Time Limit: 2000MS Memory Limit: 20000K Description In modern society, each person has his own friends. Since all the people are very busy, they communic