• [上下界网络流]【学习笔记】


    上下界网络流


    前言

    我花了几乎一个白天的时间来想为什么有源汇最大流求出的保证是原图的最大流...现在已经不想提这个东西了...简单记一下吧,乱七八糟的思考过程略去了


    上下界网络流概述

    网络流:满足容量限制和流量平衡
    上下界网络流:同时有流量上界和流量下界

    [forall i in V-{s,t}, sum_{(u,i)in E}f(u,i) = sum_{(i,v)in E}f(i,v) \ B(u,v) le f(u,v) le C(u,v) \ ]

    必须流:B
    自由流:C-B

    无源汇可行流

    没有源点和汇点,要求每个点流量平衡

    直接令(f(u,v)=B(u,v)+g(u,v) ightarrow g(u,v) le C(u,v)-B(u,v))
    这时候在附加网络中求出的可行流g不满足原网络流量平衡的限制,因为每条边下界不同
    通过引入附加源汇ss,tt来补充流量
    (extra(i)=sum_{(u,i)in E}B(u,i) - sum_{(i,v)in E}B(i,v))
    流入下界-流出下界
    extra(i)>0, 需要额外流入流量; extra(i)<0, 需要额外流出流量.
    分别让附加源和附加汇连边,然后求ss到tt的最大流,如果从ss出的所有边满流那么有解,求出的就是原图的一个可行流
    这时候原图中每条边的流量(f(u,v)=B(u,v)+g(u,v))

    有源汇可行流

    有源点s汇点t,求可行流

    转化成无源汇可行流,t到s连INF的边就可以了
    这时候s到t可行流的流量就是(t ightarrow s)边的流量

    有源汇最大流

    有源点s汇点t,求最大流

    求出有源汇可行流后,直接求s到t的最大流就可以了
    原来的流量平衡且满足下界是不会受到影响的
    并且这样求出的就是原图的最大流,我想了接近一天现在有点明白了吧
    也可以把(t ightarrow s)删掉求最大流再加上可行流的流量,效果相同

    有源汇最小流

    有源点s汇点t,求最小流

    因为下界存在最小流才有意义!否则全0就可以了
    先求有源汇可行流,这次我们要让自由流尽量少,删掉(t ightarrow s)后求t到s的最大流,让可行流减去它就可以了

    上下界费用可行流

    有源点s汇点t,求最大/最小费用流

    转化成无源汇可行流的建图,直接使用费用流算法求ss到tt的最大流

    因为有下界的存在,这类费用流问题没有"最小费用最大流"之类的限制,只要是可行流就可以


    总结

    实现上注意两点易写错的地方:

    1. 加t到s容量INF的边
    2. extra为负的向t连边时容量为-extra
  • 相关阅读:
    【java】一维数组循环位移方阵
    【java】for循环输出数字金字塔
    C++编程tips
    C++中cin.get 和cin.peek 及其相关的用法
    ubuntu增加字符设备驱动程序/ 操作系统课程设计
    C++ Primer 学习笔记/ 处理类型
    C++学习,顶层const
    C++学习笔记/const和指针
    ubuntu16.04增加系统调用(拷贝)
    Java学习笔记#数组 循环遍历
  • 原文地址:https://www.cnblogs.com/candy99/p/6637512.html
Copyright © 2020-2023  润新知