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

我退坑很久了,这篇文章不是因为刷OJ而写的总结,毕竟菜鸡老年人, 23333

之前我学网络流看的是算法书和别人的博客然后就开始套板子,而这次因为考试不得已把课本上的定理都看了一遍,瞬间对最大流算法更加清楚了。

1.定义

在学习网络流算法前要了解的一些知识。

1.对于一个有向的网络$G=(N, A, C)$,其中的$c_{i,j}$表示弧$(i,j)\in A$的容量,并设$s,t$为发点和收点,令
$$
x_{i,j}=通过弧(i,j)的流量
$$
2.对于一个满足流量限制的流量称之为可行流,其中限制条件为
(1)守恒方程(对于非收发点,流入流量等于流出流量)
$$
\sum_j x_{i,j}-\sum_j x_{j,i}=\left\{
\begin{aligned}
+v,\,\,\, i =s \\
0,\,\,\, i \neq s,t \\
-v,\,\,\, i =t
\end{aligned}
\right.
$$
3.设P是G中从s到t的无向路,若弧$(i,j)$的方向是从s到t,那么称之为前向弧,否则为后向弧。
4.如果对于G的一个无向路P,有前向弧$(i,j)$,$x_{i,j} < c_{i,j}$。有后向弧$(i,j)$,$x_{i, j}>0$则称P为增广路。

2.算法思想

以Ford-Fulkerson算法为例进行介绍

最大流算法的思想是找一条增广路,对其进行增加流量值,使其变成一个新的可行流,直到找不到增广路。

可是为什么是增广路呢?

那是因为增广路有且仅有以下两种情况,均可以增加流量

1.增广路上都是前向弧。

图中黑色数字表示边容量,红色数字表示现有流量。下图同。

对于这种情况,直接对每个边上进行流量的增加就好了。

2.增广路上有后向弧。

这种情况才是网络流中的重中之重。

对于前向弧进行流量的增加一个单位,对于后向弧进行流量的减少一个单位。

为什么要这么做呢?观察弧$(5,4)$,如果我们把这个弧上的流量退掉,那么退掉的这部分流量就可以增加到弧$(5,6)$上,保持节点5的流量守恒,因为节点5的退流,节点4流入的流量就减少一个单位,但是我们把节点4前面的前向弧都增加了一个单位,因此同样保证了节点4的守恒,同时增加了流量。

所以可以利用后向弧的这个特点对增广路进行流量的增加。

这样就得到了增广路的所有情况均可以对流量进行增加。

3.算法的理论证明

下面为网络流的两个主要定理:
1.增广路定理:一个可行流是最大流当且仅当不存在关于它从s到t的增广路。
证明:
首先求出最大流的上界
定义一个弧割$(S,T)$,其中$s\in S, t\in T$ 【弧割:去掉使得图强连通的分支严格增加的边的集合,这里指的是去掉使得图的点集合N被分成S和T两个集合】
那么割$(S,T)$的容量定义为$C(S,T)=\sum_{i\in S}\sum_{j\in T}c_{i,j}$
因此可知从s到t的流量v不会大于$C(S,T)$,即
$$
v\leq C(S,T)
$$
然后证明这个这个可行流是最大流

取S为从s可按照增广路到达的点集合,$T=N-S$,那么可以得到对于任意的$i\in S$和$j\in T$,有前向弧为满流状态,后向弧为0。(因为从i到j已经没有路可走了,只有这两个状态)
因此有
$$
v=\sum_{i\in S}\sum_{j\in T}x_{i,j}=\sum_{i\in S}\sum_{j\in T}c_{i,j}=C(S,T)
$$
由最大流的上界可以保证此时达到最大流。
2.最大流最小割定理:一个$(s,t)$流的最大值为$(s,t)$割的最小容量。
证明;
根据前面的证明可以知道最大流为C(S,T)的下确界,而在推到过程中可以取到,所以该定理成立。

然后所有的理论工作就完成了,剩下的就是对网络进行DFS或BFS直到找不到增广路为止。

原文地址:https://www.cnblogs.com/cniwoq/p/9245813.html

时间: 2024-10-10 01:22:53

最大流算法和理论的简单理解的相关文章

数据挖掘之KMeans算法应用与简单理解

一.背景 煤矿地磅产生了一系列数据: 我想从这些数据中,取出最能反映当前车辆重量的数据(有很多数据是车辆上磅过程中产生的数据).我于是想到了聚类算法KMeans,该算法思想比较简单. 二.算法步骤 1.从样本中随机取出k个值,作为初始中心 2.以k个中心划分这些数据,分为k个组 3.重新计算出每个组的中心,作为新中心 4.如果初始中心和新中心不相等,则把新中心作为初始中心,重复2,3.反之,结束 注意: 1.我没有用严格的算法定义,怕不好理解 2.KMeans善于处理球形数据,因此随机取k个质心

快速排序算法的简单理解

快速排序算法的简单理解 本文用的编程语言为python,简单阐释了作者对快速排序算法的学习心得,尽量用通俗易懂的方式向读者表达.如果文章中有什么纰漏与错误,请读者指正. 在了解快速排序之前,我们先来了解一下递归 递归 递归调用自己的函数 先来看一个函数 def (i): print(i) countdown(i-1) 这是一个不断递减的函数,如果调用这个函数,它会无限循环下去.这可不是一件好事.我们应该给予它一些限制,告诉它什么时候停止调用自己,什么时候调用自己.我们把这种限制分别叫做基线条件与

[翻译和注解]Kafka Streams简介: 让流处理变得更简单

Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Kafka Streams还没有正式发布,所以具体的API和功能和0.10.0.0版(2016年6月发布)有所区别.但是Jay Krpes在这简文章里介绍了很多Kafka Streams在设计方面的考虑,还是很值得一看的. 以下的并不会完全按照原文翻译,因为那么搞太累了……这篇文件的确很长,而且Jay

接口限流算法总结

背景 曾经在一个大神的博客里看到这样一句话:在开发高并发系统时,有三把利器用来保护系统:缓存.降级和限流.那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了.通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的.本篇文章将会介绍一下常用的限流算法以及他们各自的特点. 算法介绍 计数器法 计 数器法是限流算法里最简单也是最容易实现的一种算法.比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个.那么我们可以这么做:在一开 始的时候,我们可

网络最大流算法—Dinic算法及优化

前置知识 网络最大流入门 前言 Dinic在信息学奥赛中是一种最常用的求网络最大流的算法. 它凭借着思路直观,代码难度小,性能优越等优势,深受广大oier青睐 思想 $Dinic$算法属于增广路算法. 它的核心思想是:对于每一个点,对其所连的边进行增广,在增广的时候,每次增广“极大流” 这里有别于EK算法,EK算法是从边入手,而Dinic算法是从点入手 在增广的时候,对于一个点连出去的边都尝试进行增广,即多路增广 Dinic算法还引入了分层图这一概念,即对于$i$号节点,用$dis(i)$表示它

限流算法之漏桶算法、令牌桶算法

昨天CodeReview的时候看到同时使用RateLimiter这个类用作QPS访问限制.学习一下这个类. RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类. 1.限流 每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪. 通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务,或者引流. 如果要准确的控制Q

常用的接口限流算法

在开发高并发系统时,有三把利器用来保护系统:缓存.降级和限流.那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完了就没了.通过限流,我们可以很好地控制系统的qps,从而达到保护系统的目的.本篇将会介绍一下常用的限流算法以及他们各自的特点. 算法介绍 计数器法 计数器法是限流算法里最简单也是最容易实现的一种算法.比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个.那么我们可以这么做:在一开始的时候,我们可以设置一个计数器counter,每当一个请求过来的时

趣写算法系列之--匈牙利算法(真的很好理解)

[书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(-_-

回溯法之八皇后问题简单理解

回溯法,简单理解就是有源可溯.基本思想要借鉴穷举法,但是它不是一味地穷举,当发现某一步不符合条件时,这一步后面的穷举操作就不进行了(俗称“剪枝”),我自己把它叫做动态穷举法.假设第一个步骤可行,那么执行第二个步骤,第三个......如果其中第三个步骤不行,那么我们再回过来(回溯),第二个步骤换一种方法尝试,然后再重新第三个步骤,第四个......直到完成任务要求为止. 这里,以八皇后问题为例.试图把回溯法讲清楚. 注意:递归应该是一种算法结构,回溯法是一种算法思想. 何为八皇后问题? (百度百科