zoukankan      html  css  js  c++  java
  • 有上下界的网络流 学习笔记

    声明:本篇博客转载自此处https://blog.csdn.net/clove_unique/article/details/54884437#comments

    预备知识

    f(u,v)表示u->v这条边的实际流量
    b(u,v)表示u->v这条边的流量下界
    c(u,v)表示u->v这条边的流量上界
    在一个无源汇的普通网络流图中,满足

    • 0f(u,v)c(u,v)
    • f(u,i)=f(i,v)

    分别称为流量限制条件和流量平衡条件
    而在有上下界的网络流图中,由于多了流量下界b(u,v)的限制,满足

    • b(u,v)f(u,v)c(u,v)
    • f(u,i)=f(i,v)

    无源汇可行流

    建图方法

    将有上下界的网络流图转化成普通的网络流图

    • 首先建立附加源点ss和附加汇点tt
    • 对于原图中的边x->y,若限制为[b,c],那么连边x->y,流量为c-b
    • 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和
      • 若d(i)>0,那么连边ss->i,流量为d(i)
      • 若d(i)<0,那么连边i->tt,流量为-d(i)

    求解方法

    在新图上跑ss到tt的最大流
    若新图满流,那么一定存在一种可行流
    此时,原图中每一条边的流量应为新图中对应的边的流量+这条边的流量下界

    证明

    在原图中,假设每条边的实际流量为f(u,v)=b(u,v)+g(u,v)
    其中g(u,v)c(u,v)b(u,v)

    我们可以将原图中的边改为上界为c(u,v)b(u,v)的边,变成一个普通的网络流图
    经过以上的改造,g(u,v)实际上是新图中边u->v的实际流量,原图中的实际流量f(u,v)=b(u,v)+g(u,v)
    但是如果在这个新图中直接求可行流的话是错误的

    举个栗子
    原图
    这里写图片描述
    按照上面的方法改造过的新图
    这里写图片描述
    这个图的可行流为1,还原成原图的实际流量为
    这里写图片描述
    很显然满足流量限制条件,但是不满足流量平衡条件

    由于需要满足流量平衡条件
    f(u,i)=f(i,v)
    [b(u,i)+g(u,i)]=[b(i,v)+g(i,v)]
    b(u,i)b(i,v)=g(i,v)g(u,i)
    d(i)=b(u,i)b(i,v)
    d(i)>0
    g(i,v)=g(u,i)+d(i)
    所以需要一条边流量为d(i)来补流
    这里写图片描述
    d(i)<0
    g(u,i)=g(i,v)+[d(i)]
    所以需要一条边流量为d(i)来分流
    这里写图片描述
    可以发现,添加的所有与附加源点或者附加汇点相连的边必须满流,原图才有可行流
    证毕

    有源汇可行流

    建图方法

    在原图中添加一条边t->s,流量限制为[0,inf]
    即让源点和汇点也满足流量平衡条件
    这样就改造成了无源汇的网络流图
    其余方法同上

    求解方法

    同 无源汇可行流

    证明

    同 无源汇可行流

    有源汇最大流

    建图方法

    同有源汇可行流

    求解方法

    在新图上跑ss到tt的最大流
    若新图满流,那么一定存在一种可行流
    记此时f(s,i)=sum1
    将t->s这条边拆掉,在新图上跑s到t的最大流
    记此时f(s,i)=sum2
    最终答案即为sum1+sum2

    证明

    添加附加源汇的作用:为了满足流量平衡条件,在新图中进行相应的补流或分流
    只要连接附加源汇的边满流,新图中s->t的任意一种可行流都是原图的可行流
    跑ss->tt的最大流了之后,相当于是使连接附加源汇的边满流,进而求出了一种可行流
    再将t->s的边拆掉(使s->t变成一个有源汇的网络流图),跑s到t的最大流,加上跑出来的最大流即为原图中一种可行的最大流

    有源汇最小流

    建图方法

    同 无源汇可行流

    求解方法

    求ss->tt最大流
    连边t->s,inf
    求ss->tt最大流
    答案即为边t->s,inf的实际流量

    证明

    第一遍做的时候并无t->s这条边,所以s->t的流量已经尽力往其它边流了
    加上t->s这条边后,流过这条边的都是些剩余的流不到其他边的流量,从而达到尽可能减少T->S这边上的流量的效果,即减小了最终答案。

    有源汇费用流

    建图方法

    将有上下界的网络流图转化成普通的网络流图

    • 首先建立附加源点ss和附加汇点tt
    • 对于原图中的边x->y,若限制为[b,c],费用为cost,那么连边x->y,流量为c-b,费用为cost
    • 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和
      • 若d(i)>0,那么连边ss->i,流量为d(i),费用为0
      • 若d(i)<0,那么连边i->tt,流量为-d(i),费用为0
    • 连边t->s,流量为inf,费用为0

    求解方法

    跑ss->tt的最小费用最大流
    答案即为(求出的费用+原图中边的下界*边的费用)

    证明

    注意:
    有上下界的费用流指的是在的最小费用流
    在满足流量限制条件和流量平衡条件并且满足的情况下的最小费用流
    也就是说,有上下界的费用流只需要满足网络流的条件就可以了,而普通的费用流是满足一般条件并且满足是最大流的基础上的最小费用

    证明同 有源汇的可行流

    小结

    重点理解“补流”和“分流”的作用
    注意流的“等效”

查看全文
  • 相关阅读:
    JVM简单入门
    10 张图聊聊线程的生命周期和常用 APIs
    Spring Cloud实战 | 最八篇:Spring Cloud +Spring Security OAuth2+ Axios前后端分离模式下无感刷新实现JWT续期
    ueditor 插入视频代码解析
    CentOS下添加新硬盘并分区格式化的详细步骤
    Java 8 stream
    crontab命令详解
    计算机网络自顶向下学习杂记
    nginx安装
    js识别PC和H5
  • 原文地址:https://www.cnblogs.com/Iking123/p/11279357.html
  • Copyright © 2011-2022 走看看