zoukankan      html  css  js  c++  java
  • 有上下界网络流问题

    有上下界网络流

    有上下界的网络流即是在普通的网络流的基础上,额外添加每条边流量的限制。

    普通的网络流可以认为是特殊情况的上下界网络流,即流量限制为(f_iin [0,maxflow])

    而现在,我们要求的每条边的容量限制为(f_iin [B_i,C_i])

    这类问题我们大致可以分成三类。

    无源汇 上下界可行流

    因为没有源点和汇点,所以所有点都要满足流量平衡。

    如果我们能够不考虑下界的话,就直接可以照搬最大流。

    因为下界是一定要流满的,所以我们先强制所有边流满下界,只考虑剩下的流量(g_i)

    那么,也就是对于每一个点(x),都要满足流量平衡的方程:

    [sum B_{(x,v)}+sum g_{(x,v)}=sum B_{(u,x)}+sum g_{(u,x)} ]

    如果能够满足这个方程的话,每条边流量为(B_i+g_i)即是一组可行流。

    考虑将流量分类,因为(B)是已知量,所以移项考虑左侧(B)和右侧(g)

    假设左侧(M(x)=sum B_{(u,x)}-sum B_{(x,v)})

    所以变成了需要满足(M(x)=sum g_{(x,v)}-sum g_{(u,x)})

    因为不知道谁大谁小,所以按照(M)大小进行分类讨论

    如果(M(x)ge 0),那么有(sum g_{out}=sum g_{in}+M)

    也就是流出需要比流入的流量要多(M),但是需要满足流入等于流出。

    所以建立一个超级源,连边((S,x)),容量为(M),来补足流入少的(M)

    反之,如果(M(x)lt 0)

    也就是流入多于流出,那么需要额外流出(M)

    同理建立超级汇,连边((x,T)),容量为(-M),补足流出不足的(M)

    现在已经可以满足流量平衡了,在当前图上跑最大流。

    因为上面的所有(M)都是已知量,也就是如果可行流存在的话,

    所有的流出源和流入汇的所有边必须满流,否则无法补足上述流量下界要求的东西。

    所以这里就可以解决无源汇可行流的问题。

    有源汇 上下界可行流

    依然是可行流问题,上面已经解决了无源汇的可行流问题,考虑能否将当前的有源汇转化为无源汇。

    显然有源汇的的可行流中,除了源汇之外的所有点都满足流量平衡。

    而流出源的容量等于流入汇的流量,所以连边汇到源,容量为(inf),这样所有点都可以满足流量平衡。

    同时没有了源汇,转换为了无源汇上下界可行流问题。

    有源汇 上下界最大流

    由可行流变为了最大流问题。

    首先明确一点,最大流一定是可行流,所以一定要先判断是否存在可行流。

    跑完可行流之后可能有一些边还可以接着流,既然已经存在可行流了。

    删除超级源超级汇,以及(T->S)的边,再在残余网络上解决最大流即可。

    (超级源汇没有必要删去,因为不会答案产生影响)

    那么答案就是残余网络上的最大流加上可行流。

    注意一下可行流是什么东西,是(T->S)这条边流过的流量。

    不要和超级源超级汇之间的流量搞混了。

    我写的板子

    有源汇 上下界最小流

    最小流问题,在没有上下界限制的时候是没有意义的。(因为你可以所有边都不动啊)

    首先还是判断可行流是否存在。

    和上面一样删除掉超级源汇以及(T->S)的边,继续在残余网络上考虑。

    其实只需要尽可能退流就好了,也就是求(T->S)的最大流,然后用可行流-最大流即可。

    我写的板子

    Last

    这套理论从这里学的,这个博主好强啊orzorz

  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9286087.html
Copyright © 2011-2022 走看看