目录

  • 第一部分:最大不相交路径数
  • 第二部分:最大流最小割定理
  • 最大流问题
  • 两个名词:残留网络,增广路径
  • 续:Ford-Fulkson算法的正确性

第一部分:最大不相交路径数

设有如下图G:

请问:

使用观察法可以得知,最多是2条。

但是目前是这样的,要你使用计算机编一个算法来求解这个问题,你会吗?我猜你不会哈哈。所以我下面提供一种思路,就是每一次找一条s-t路径,然后删去这条路径上的边,在剩下的图继续找。

但是,这个算法有缺点:如果第一次找了一条下面的s-t路径

那么删除之后就只剩下了红色的边:

这个时候,找不到s-t路径了,所以算法就得出结论:最多只有1条不相交的s-t路径,这是错误的。所以我们要改进这个算法!
改进的思路是:纠正以前走错了的路径。比如对于上面,我们的做法是,将已走的所有路径方向反向

然后再寻找一条路径

我们把第一条路径和现在这条路径取并集,就有了:

把那个相互抵消的删除,就得到了两条路径:

放回到原图中,就是:

我们发现:第一次找的路径和第二次路径都被纠正了。
接下来:我们继续,将纠正后的路径反向。

这个时候已经无法找到s-t路径,算法停止。宣布最多有2条不相关的路径。

后续会证明这个算法是不是能够找到最大不相交路径数。

第二部分:最大流最小割定理

引入割的概念,其实并不是必要的,只是大家平常在别的资料会看到,所以把这个概念说一下。

我们继续分析第一部分中最后的那一幅图,这个时候已经找到了最大不相交路径了。我们从源点s开始,使用深度优先搜索或者广度优先搜索,发现只能搜索到s这个顶点,我们令大S={s},T=V-S。即顶点被划分成两个集合:

这个顶点的S-T划分产生了一个S-T割,大小为0,因为S没有到T的边。但是,S-T割在原图(没有反向的时候)中其实是T-S割(割是有方向的),其大小为2,T-S割等于{(a,s),(d,s)},原图中是S-T割{(s,a),(s,d)}。

说割这个概念有什么用?

上述T-S割的大小2就是最小割,即原图中没有更小的割了。举个栗子,我们令S={s,b},T={a,d,c,t}(注意一下,割要求s在S中,t在T中)。这个时候S-T割={(s,a),(s,d),(b,c),(b,t)},这个割大小为4,比2大。

最大流最小割定理:求最多有多少条不相交的路径(最大流),其实就是求最小割!上面两者都是等于2。因为按照割的定义,对于任意一个S-T割,集合S包含源点,T中包含汇点(终点),所以一条路一定要从S中出来到T。而找割中最小的,可以保证最多有多少条不相交的路径。

试想,如果最小割是2,现在有一个割是3,说明这个割大小为3的割有一条边是用不上的,而最小割2需要满载,全部用上。

形式化地有:

  1. 最多不相交的路径条数设为k,假设我们找到一个割,大小为m,则k≤mk\le mk≤m。设最小割为mminm_{min}mmin​,从而也有:k≤mmink\le m_{min}k≤mmin​
  2. 另一方面,我们不妨分割为S={s},T=V-S,由于最多不相交的路径条数为k,从而那么s肯定至少有k条出边,即这个S-T割的大小m′≥k≥mminm'\ge k\ge m_{min}m′≥k≥mmin​。为什么?
  3. 由k≤mmink\le m_{min}k≤mmin​和k≥mmink\ge m_{min}k≥mmin​得到k=mmink=m_{min}k=mmin​。

稍微补充一下为什么上述可以看成是最大流问题?因为上述图可以看成是每条边容量为1的网络,那么最多有多少条不相交的路就是最大流的意思。

最大流问题

有了上述铺垫,这里变得异常简单,我们将上述容量为1推广至任意整数如下:

我们还是可以使用之前的做法,把里面的容量,直接拆分为1的组合。比如弧(s,a)的容量为20,那么我们就在顶点s和顶点a之间连20条边,然后转化成求最大不相交路径数。

两个名词:残留网络,增广路径

到这里,其实怎么求解最大流问题已经说完了,只剩下一些名词给大家再说一下,这也是其他文章中经常出现的,但是,现在再看其实很简单。

残留网络:在原网络上,将之前已经找到的路径上的弧反向,其他弧方向保持不变,就得到了残留网络。比如前面的:

(网络最大流问题的)增广路径:在残留网络中找一条由s通往t的路径,找到的这条路径就叫做增广路径。

知识小补充:增广路径这个词的具体意义在图的不同问题是不同的。

Ford-Fulkson算法:这个算法是由两个人Ford和Fulkson一起完成的。这个算法就是上述我们的:找一条路,反向,找一条路,直到找不到。或者另外一种说法:找增广路径,构造残留网络,找增广路径,直到找不到

续:Ford-Fulkson算法的正确性

大家应该能够体会到上面过程的正确性,但是仅仅是体会,我们却并没有给予证明。比如

  1. 为什么:将之前路径反向后,如果找到一条新的路,那么一定说明又多了一条不相交的路。
  2. 为什么:将之前路径反向后,如果找不到路径了,那么一定说明不相交路径的数量已经达到了最大。

(2) 的证明已经在第一部分结尾和第二部分给出,这里仅做部分叙述,这里和前面同时都要去看。找不到路径的时候,反向,对源点进行遍历,把能够遍历到的顶点集合设为S,剩下的顶点集合设为T,那么T-S割的大小对应着原图的最小割。根据最大流最小割定理,此时是最大流(不相交路径的数量已经达到了最大)。

(1) 的证明:
假设我们已经找到了P1,P2,P3三条路径,那么反向后应该得到如下图:

有人问,起点和终点不是只有1个吗?上面怎么3个。确实就是1个,所以我用了一个虚线的框,框起来。我这样画纯粹是为了好看,等下你就知道。如果你强迫症也可以下面这样,无所谓的:

言归正传,假设我们对P1,P2,P3反向,其他正向保持不变后,找到了一条路径P4,例如下面的蓝色路径。P4踩了反向的弧(深蓝),也经过了以前从来没有被用过的正向的弧(浅蓝)。

我们下面要证明:在原图中,一定有了4条不相交的路径。

和前面第一部分的纠正过程一样,我们将下面红色的一小段路删除。

再重新组合,得到原图中的如下四条路径。完美,完结。

深入理解网络最大流和Ford-Fulkson算法相关推荐

  1. 拳王公社:网络引流的“4大核心秘诀“,让客户源源不断地加你

    前几天,拳王分享了一篇<从0-1!只需掌握这3个重点,网创新人再也不缺精准流量了>,揭秘了网创新人如何从0-1打造被动引流系统,吸引到更精准的流量. 今天,我们分享的是:<一文讲透网 ...

  2. 网络最大流模板(标号法)

    测试数据 6 10 0 1 8 2 0 2 4 3 1 3 2 2 1 4 2 2 2 1 4 2 2 3 1 1 2 4 4 0 3 4 6 0 3 5 9 3 4 5 7 2 0->1:4 ...

  3. 网络最大流中一般增广路算法(标号法)

    网络最大流主要有两大类求解方法:增广路算法和预流推进算法 一般增广路算法:主要分为初始流为零流和初始流为非零流的情况!后者在标号的时候注意一条边是正向连接还是反向连接:若是反向的连接,那么在调整的时候 ...

  4. Ford-Fulkerson 标号法求网络最大流

    使用Ford-Fulkerson 标号法求网络最大流. ①c.f初始化为INF表示该边不存在 #include <iostream> #include <cstdio> #in ...

  5. 网络最大流和最小费用流

    from: http://richardxx.yo2.cn/articles/网络最大流和最小费用流.html 这段时间复习了下网络流模型,感觉比以前的理解有了长足进展,虽然我知道这东西难就难在建模上 ...

  6. 应用角度理解H264码流

    应用角度理解H264码流 前言 1.NAL 2.SPS.PPS 2.1 SPS 2.2 PPS 3.Slice&MB 3.1.Slice 3.2.MB 4.RTP负载 5.AUD 6.文献 前 ...

  7. Android音视频学习系列(七) — 从0~1开发一款Android端播放器(支持多协议网络拉流本地文件)

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  8. 【ybt金牌导航3-2-1】【luogu P3376】网络最大流【Dinic算法】

    网 络 最 大 流 网络最大流 网络最大流 题目链接:ybt金牌导航3-2-1 / luogu P3376 题目 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数 ...

  9. 【网络流】解题报告:luogu P3376 【模板】网络最大流

    题目链接: P3376 [模板]网络最大流 Dinic Dinic算法是网络流最大流的优化算法之一,每一步对原图进行分层,然后用DFS求增广路.时间复杂度是O(n^2*m),Dinic算法最多被分为n ...

最新文章

  1. [转载]ESFramework 4.0 快速上手(15) -- 客户端登录验证
  2. 巧用WINDOWS脚本语言删除临时文件
  3. android的指纹问题
  4. leetcode607. 销售员(SQL)
  5. quartz的job类无法保留本身通过spring注入的属性问题
  6. 为了分析WebRTC, 重学Windows开发
  7. postman 获取接口参数_使用Postman管理API接口
  8. NYOJ 300 amp;amp; hdu 2276 Kiki amp; Little Kiki 2 (矩阵高速功率)
  9. BBS论坛管理系统软件建模实验
  10. 显示器尺寸对照表_求解显示器屏幕尺寸对照表一般是多少?
  11. php 递归中的全局变量,PHP递归函数内的静态变量
  12. 【MM32F5270开发板试用】一、移植 TencentOS 到 PLUS-F5270
  13. 如何将手机里的PDF文件转换成Word文档
  14. 教师资格证面试 计算机应用,2019下半年初中信息技术教师资格证面试真题及答案汇总...
  15. android关闭背光
  16. input值变化监听事件
  17. 学生DW静态网页设计我的家乡——四川文化(4页) HTML+CSS+JavaScript 家乡主题HTM5网页设计作业成品
  18. elasticsearch插件一——-head插件安装详解
  19. 从mybatis拦截器维度处理读写分离的多数据源问题
  20. 手把手教做Excel直方图

热门文章

  1. 豆瓣评分8.6,这本书启发无数开发者
  2. 分分钟带你杀入Kaggle Top 1%
  3. TensorFlow学习(四):优化器Optimizer
  4. 独家 | Python中的SOLID原则(附链接)
  5. 革新Transformer!清华大学提出全新Autoformer骨干网络
  6. 图像分类:来自13个Kaggle项目的经验总结
  7. 数据不够,是模型表现不佳的“借口”,还是真正的问题所在?
  8. 新冠肺炎数据里学到的四个数据分析和机器学习知识
  9. 剑指offer:两个链表的第一个公共结点
  10. 马斯克入选美国工程院院士,张宏江博士入选外籍院士