标号法求最大流

图论中网络的相关概念见上篇博客

算法基本思想:
从某个初始流开始,重复地增加流的值到不能再改进为止,则最后所得的流将是一个最大流。为此,不妨将每条边上的流量设置为0作为初始流量。为了增加给定流量的值,我们必须找出从发点到收点的一条路并沿这条路增加流量。

当前流为最大流的充要条件:网络中不存在增广路
最大流最小截定理:在任何网络中,最大流的流量等于最小截集的容量。
整数流定理:在任何网络中,如果网络所有的弧容量都是整数,则存在整数最大流。

明确一点:最大流是指网络中流的值达到最大,即源的出流量或汇的入流量达到最大,每段弧都有对应的流量,而不是求网络中某个路径的流量。

把最大流算法想象成两个运输站之间运货,两个运输站之间有很多个中转站,每个中转站都有一个最大容量,站与站之间运货都有不同的运货量,而且中转站不会留货物,所以货物的总量一定等于源站的出货数或者汇站的进货数。最大流算法就是在不超过所有中转站的容量的情况下,求最大出货量/进货量以及所有中转站之间的运货量。
如下图所示,左边是容量,右边是流量,在如图所示的流中,流的值达到了最大,为13,也不存在增广路,所谓增广路就是一条从源到汇的路径,路径上的所有弧非饱和(正向)或非空(反向),即一条仍能增加流量的路。

为什么说增广路是一条仍能增加流量的路?其实不难理解,增广路的定义如上文,路径上的所有弧非饱和(正向)或非空(反向),反向弧的流量假设为n,实际上等价于为正向弧的流量为-n,因为n不能小于0,所以n=0的时候,反向弧的流量虽然达到了最小,但是把他当做正向弧的时候,流量却达到了最大。
对于一条路径而言,非饱和弧和非空弧都意味着该条路径的流量没有达到饱和。既然网络中存在一条没有达到饱和的路径,那么网络的流也没有达到最大。这就是当前流为最大流的充要条件,可用数学语言证明。

算法文字描述:
步骤0:将网络中所有弧流量全部置0
步骤1:将源的点流量设为无穷大,令u=s。
步骤2:标记 点vi=uv_i=uvi​=u的所有未被标记的邻点vjv_jvj​的点流量(BFS)。
标记方法:若u到邻点是正向弧,且流量小于容量,则点流量Δ(vj)Δ(v_j)Δ(vj​)取前点流量Δ(vi)Δ(v_i)Δ(vi​)和弧的容流量差值Cij−FijC_{ij}-F_{ij}Cij​−Fij​的较小者
若是反向弧连接,且流量大于0,则点流量Δ(vj)Δ(v_j)Δ(vj​)取前点流量Δ(vi)Δ(v_i)Δ(vi​)和弧流量FijF_{ij}Fij​的较小者
步骤3:若标记到了汇则转步骤4,否则任选一个刚刚被标记的点设为uuu,转步骤2,若刚刚没有标记任何点则算法结束。(步骤2由于会执行多次,刚刚表示步骤2最近一次执行时标记的点,即viv_ivi​的可被标记的邻点
步骤4:从汇开始,依次回溯被标记的点,并将两点之间的弧加/减一个汇流量Δ(t)Δ(t)Δ(t),正向则加,反向则减,回溯到源后,转步骤1。

算法符号描述:
步骤0: 设F是从源s到汇t的任意可行流,对任意<μ,v>=<vi,vj>∈E<μ,v>=<v_i,v_j>∈E<μ,v>=<vi​,vj​>∈E,令Fij=0F_{ij}=0Fij​=0。//从零流开始。
步骤1: 对源s=v0s=v_0s=v0​标记为(s,+,Δ(s)=∞),S={s},U={vj},j=0,1,2,⋯,n;μ=vi=s。(s,+,Δ(s)=∞),S={s},U={v_j},j=0,1,2,⋯,n;μ=v_i=s。(s,+,Δ(s)=∞),S={s},U={vj​},j=0,1,2,⋯,n;μ=vi​=s。(S表示已标记的顶点集,U未检查的顶点集,初始值为全体顶点。)
步骤2: 对S¯S¯S¯(S的补)中与μ=viμ=v_iμ=vi​的所有邻点vjv_jvj​,有:
(1) 若<vi,vj>∈E,且Fij<Cij<v_i,v_j>∈E,且F_{ij}<C_{ij}<vi​,vj​>∈E,且Fij​<Cij​,则将vjv_jvj​标记为(vi,+,Δ(vj))(v_i,+,Δ(v_j))(vi​,+,Δ(vj​)),其中Δ(vj)=min⁡{Δ(vi),Cij−Fij},S=S∪vjΔ(v_j)=min⁡{Δ(v_i),C_{ij}-F_{ij}},S=S∪{v_j}Δ(vj​)=min⁡{Δ(vi​),Cij​−Fij​},S=S∪vj​。
(2) 若<vj,vi>∈E<v_j,v_i>∈E<vj​,vi​>∈E,且Fij>0F_{ij}>0Fij​>0,则将vjv_jvj​标记为(vi,−,Δ(vj))(v_i,-,Δ(v_j))(vi​,−,Δ(vj​)),其中Δ(vj)=min⁡{Δ(vi),Fij},S=S∪vjΔ(v_j)=min⁡{Δ(v_i),F_{ij}},S=S∪{v_j}Δ(vj​)=min⁡{Δ(vi​),Fij​},S=S∪vj​。
步骤3: 若vj=t∈Sv_j=t∈Svj​=t∈S,转步骤4,否则vj≠tv_j≠tvj​​=t,令U=U−viU=U-{v_i}U=U−vi​,若S∩U=φS∩U=φS∩U=φ,则算法结束,当前流为最大流;否则若S∩U≠φS∩U≠φS∩U​=φ,任选vi∈S∩Uv_i∈S∩Uvi​∈S∩U,转步骤2。(实际上,S∩U就是步骤2中刚刚被标记的点)
步骤4: 令z=tz=tz=t。
步骤5: 若zzz的标记为(g,+,Δ(z))(g,+,Δ(z))(g,+,Δ(z)),则F(<g,z>)=F(<g,z>)+Δ(z)F(<g,z>)=F(<g,z>)+Δ(z)F(<g,z>)=F(<g,z>)+Δ(z);
若z的标记为(g,−,Δ(z))(g,-,Δ(z))(g,−,Δ(z)),则F(<z,g>)=F(<z,g>)−Δ(z)F(<z,g>)=F(<z,g>)-Δ(z)F(<z,g>)=F(<z,g>)−Δ(z)。
步骤6: 若g=sg=sg=s,则取消所有点的标号,转步骤1,否则,令z=gz=gz=g,转步骤5。
标记的意义:(vi,+,Δ(vj))(v_i,+,Δ(v_j ))(vi​,+,Δ(vj​))表示点viv_ivi​经流量为Δ(vj)Δ(v_j)Δ(vj​)的正向弧到达点vjv_jvj​
(vi,−,Δ(vj))(v_i,-,Δ(v_j ))(vi​,−,Δ(vj​))表示点viv_ivi​经流量为Δ(vj)Δ(v_j)Δ(vj​)的反向弧到达点vjv_jvj​

符号描述可能不好理解,对照文字描述理解。

例子:(编辑太麻烦了,从word截的图)



欢迎讨论

最大流算法 - 标号法相关推荐

  1. 最大流(标号法 Ford-Fulkerson算法)

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; cons ...

  2. 网络流 之 一般增广路算法 标号法实现

    数据输入格式:首先输入顶点个数n和弧数m,然后输入每条弧的数据.规定源点为顶点0,汇点为顶点n-1.每条弧的数据格式为:u,v,c,f,分别表示这条弧的起点,终点,容量和流量.顶点序号从0开始. 代码 ...

  3. 最大流的Ford-Fulkerson 标号法

    最大流标号法: https://wenku.baidu.com/view/5977dc6fa45177232f60a266.html 最大流的标号法总的来说就是不断地在图中找增广路径.增广路径就是一条 ...

  4. dijkstra标号法表格_标号法求最短路径例题详解.ppt

    标号法求最短路径例题详解 r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设 ...

  5. 用标号法求最短路径matlab,标号法求最短路径例题详解重点.ppt

    r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设L是G中的一条路径, L的 ...

  6. 用标号法求最短路径matlab,标号法求最短路径例题分析.ppt

    r * 最短路径 带权图G=, 其中w:E?R. ?e?E, w(e)称作e的权. e=(vi,vj), 记w(e)=wij . 若vi,vj不 相邻, 记wij =?. 设L是G中的一条路径, L的 ...

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

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

  8. 网络流算法学习笔记——最大流问题基本概念和Ford-Fulkerson方法(标号法C++实现)

    屈婉玲<算法设计与分析>第2版第7章网络流算法学习笔记. 基本概念 最大流问题,相当于有从s到t的供水系统,每段路径都有限定流量,除了s.t两地外,每个中间点都不能滞留,从s流入多少,就从 ...

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

    测试数据 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 ...

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

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

最新文章

  1. 英特尔k跟kf区别_i5-9600K和i5-9600KF有什么区别
  2. 【收藏】解决mac问题:打不开,因为它来自身份不明的开发者
  3. qt geomery的单位是什么_斜管沉淀池的原理是什么?
  4. prop attr 到底哪里不一样?
  5. 从JAVA内存到垃圾回收,带你深入理解JVM
  6. android p过度动画,android 过渡动画
  7. Socket通讯成功案例
  8. Google 开源下一代高安全性机密运算开发框架 Asylo
  9. ut红种状态解决办法汇总
  10. CCF 区块链国际会议 统计 有哪些接收区块链论文的会议 (最全)
  11. Discuz X 多页面专题制作教程
  12. MOS管的finger和multiplier
  13. 未来五年,物联网三大技术发展趋势!
  14. iptables防火墙
  15. 以自己的电脑作为服务器,搭建网站,外网可访问
  16. 14、保存文件格式为.txt
  17. 你的人生看起来很长,每一秒都无法挽回。
  18. filepath直接指定到文件名吗_快速实现对文件按时间的重命名
  19. my97datepicker日历显示不完整
  20. java规约运算的signature_Java8笔记第七篇(Stream API 的操作-规约,收集 )

热门文章

  1. tomcat修改http长度限制_解决浏览器与服务器请求url长度限制
  2. win10下乌龟git安装和使用
  3. 胖子哥的大数据之路(8)- 数据仓库命名规范
  4. webstorm设置中文界面
  5. SQL Server 不允许保存更改。您所做的更改要求删除并重新创建一下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项
  6. 深入理解Servlet原理
  7. 【嵌入式模块】LCD1602LCD12864
  8. 简单工厂模式--计算器代码及UML图
  9. SQL慢查询日志与查询分析器explain
  10. firework算法_FireWorks 自从烟花算法的开创性论文由谭营教授等人于2010年发表之后 联合开发网 - pudn.com...