• 网络流总结


    网络流总结


    网络流基础

    一些定义

    1. (V) 表示整个图中的所有结点的集合。
    2. (E) 表示整个图中所有边的集合。
    3. (G = (V, E)) ,表示整个图。
    4. (S) 表示网络的源点,(T) 表示网络的汇点。
    5. 对于每条边 ((u, v)), 有一个容量 (C(u, v)(C(u, v) ge 0))
    6. 如果 (C(u, v) = 0),则表示 ((u, v)) 不存在在网络中。
    7. 如果原网络中不存在边 ((u, v)),则令 (C(u, v) = 0).
    8. 对于每条边 ((u, v)), 有一个流量 (f(u, v))

    注意,网络流必须满足流量平衡,即流入的等于流出的.

    最大流

    最大流算法有(EK),(Dinic),(ISAP)(HLPP),(HLPP)的上界卡的比较紧,所以这里介绍(ISAP)(Dinic)

    其实有HLPP,因为我发现自己的ISAP过不了加强版/kel.

    Dinic

    Dinic算法就是先找出残量网络中的(s o t)路径然后增广.

    代码实现

    ISAP

    考虑说每次(BFS)找残量网络中的路径很麻烦是吧,考虑优化这个过程.

    1. 反着求出每一个点的深度.
    2. 每一次增广就把深度增加.
    3. 出现断层就退出.

    这样子跑的(BFS)只有一次,可以优化.

    代码实现

    HLPP

    最高标号+预流推进,名字听着就是算法过程.

    1. 首先bfs求出所有点的(height),判断(s,t)是否连通并且将(h[s]=n).
    2. 更新(gap)
    3. (s),防止一开始就出现(Inf)的边.
    4. 推队列中的点

    最后答案就是(t)中的流量.

    (HLPP)其实只要掌握了原理写起来还是不难背诵大赛

    代码实现

    学习博客

    最小割

    将拥有源点 (S) 和汇点 (T) 的结点集合 (V) 分成两个子集 (s)(t),当且仅当 (S) 属于(s)(T)属于(t)时,称这种分割为(S − T)割。

    (s−t)的容量(C[s, t])指的是所有从(s)(t)的边的容量之和。具体公式如下:

    [C[s,t]=sum_{(u,v) in E,u in s,v in t}C[u][v] ]

    最小割,就是所有可能的 (S − T) 割中容量最小的 (S − T) 割。

    最小割=最大流.

    用最大流最小割仅仅能做到求出最小割的具体数值,但是如果题目要求的是求出最小割的方案,那么还需要进一步的操作。

    我们可以利用 dinic 算法的分层图,如果一条边((u,v))已经满载,并且(u)(S)联通,(v)(S)不连通,则把它输出,最后输出的所有边就是一个可行的最小割的方案,其实就是割的定义式.

    这个问题的拓展还有:

    1. 求哪些边一定在最小割中:把这条边退流,删除这条边后重新寻找的增广路流量与这条边原来的流量相同
    2. 求哪些边可能在最小割中:对某条边退流后重新找增广路可以使得这条边满载且$ u (和) S (联通,)v(不和)S$联通.

    费用流

    EK

    众所周知,就是(SPFA).

    代码实现

    zkw费用流

    不会,鸽了.

    二分图的一些东西

    • 可能在二分图中的点:他是来搞笑的,所有有度数的点都是可能在最大匹配中的点.
    • 一定在二分图最大匹配中的点:先求任意一个最大匹配(S),那么一定在二分图最大匹配中的点一定是(S)的子集.源点能到达的左侧的点,和能到达汇点的右侧的点就都不是一定在最大匹配中,即在残量网络中可以找到替代路径,剩下的在$ S $中的点就一定在最大匹配中.
    • 可能在二分图最大匹配中的边:先求任意一个最大匹配(S).(S)中的边都为可能在二分图最大匹配中的边,然后考虑其它边,如果一条未匹配边的两个端点中有一个不在(S)中,则这条边可能在最大匹配中,否则,如果想把这条边加入匹配,则需要一个交错环,那么我们把所有边定向,匹配边从右往左,非匹配边从左往右,如果一条边两个端点在同一个(SCC)中则也可能在最大匹配中.
    • 一定在二分图最大匹配中的边:先求任意一个最大匹配(S).那么(S)中的边中不能被非(S)的边替代的边就是一定在最大匹配中的边,所以方法也是类似的.从所有不在(S)中的点出发,能够访问到的边就都不是一定在最大匹配中的边.(如果是从左侧的点出发,那么从左到右走非匹配边,从右到左走匹配边)然后再缩点,如果(S)中某条边两段在同一个(SCC)中也不一定在最大匹配中.

    • 可能在最小割中的边:首先把所有还有流量的边拿出来跑(tarjan)缩强连通分量.如果某条满流边的两个端点不在
      同一个(SCC)中则可能在最小割中。
    • 一定在最小割中的边:首先把所有还有流量的边拿出来跑(tarjan)缩强连通分量.如果某条满流边的两个端点((u,v))满足(s)(u)在同一个强连通分量,(v)(t)在同一个强连通分量则这条边一定在最小割中。

    这两个的证明考虑可能在就是对于一条边减流量那么最小割会减小;一定在就是对于这条边加流量,那么最小割会增大.

    网络流建模

    最小路径覆盖问题

    给定一张图,要求选出尽量少的简单路径覆盖所有的点。

    考虑每一个点入度和出度都是(1),那么就转换成了一个最大匹配的问题了.

    环覆盖问题

    一张(n)个点(m)条边的有向图,你要从中选出若干个点不相交的环。记这些环覆盖的点集为(S)。求一种方案使得 S 中的点从大到小排序后字典序最大。

    首先我们现将问题转换成,可以有自环然后要求选出如干个环满足覆盖所有点.

    然后尽量不选自环即可.

    最大权闭合图

    问题:有若干个物品,每个物品有一个权值,可正可负。现在有若干限制,每个限制为一个二元组((a, b)),表示如果选了(a)就一定要选(b)。问选出一个合法物品集合的最大权值和。

    如果没有限制就肯定是先把所有的正权物品选择是吧.

    现在问题在于可能选了一个正权之后一定要选负权,那么直接割出结果.

    最大密度子图

    一张图的密度为图上的边数除以点数。现在要求一张图的最大密度子图。

    看到这种最大化(c=frac{E}{V})的模型就要想到01分数规划.

    二分之后就是(E-V*mid > 0),这个直接割就行了,要么放弃一条边,要么选择两个点.

    二元关系最小割模型

    对于这样一类问题:有若干个变量,每个变量有两种取值。有若干个限制,每个限制形如:
    如果变量 x 取值为 a,变量 y 取值为 b 则需要额外付出 c 的代价。然后要最大化所有变量的值之和减去额外代价。

    这类问题的一个经典做法就是构建最小割模型。每个变量建一个点,S 向每个点连边、每个点向 T 连边表示两种取值中要选择其中一个。然后对于一个限制就在两个变量之间连边。

    • [NOI2006]最大获利
    • BZOJ2127: happiness

    距离限制模型

    具体来说就是有某一个限制条件为两个变量取值必须要在某一个范围之内.

    • [HNOI2013]切糕

    这是最小割模型中一类常见的模型,通常形式为每个点有若干种取值,且对于相邻的两点(i, j),要求其取值$x_i , x_j (满足)x_i − x_j le d$,求一种方案使得所有取值对应的代价之和最小。
    对于此类模型,可以直接在无限制的网络上进行修改。在最小割模型中,限制条件一般用无穷大的边来表示。

    匹配角度

    一般性是将一些东西转换成匹配.

    环覆盖

    一张(n)个点(m)条边的图,有(m)条边,每条边有一个代价。要选择若干个点不相交的环覆盖所有点,最小化环上所有边权之和。

    考虑之前对于环覆盖的转换,变成一个二分图之后直接跑费用流即可.

    不等关系建立网络流模型

    这是一种很神奇的东西,将题目给出的限制条件写成不等式,不等式转换成等式,发现和流量平衡的式子很像,就可以网络流建图了.

    一般性令(-)号表示出边,(+)表示入边.

    • [NOI2008]志愿者招募
    • [ZJOI2013]防守战线

    网络流优化

    基本不会鸽了

    凸函数优化

    不会,鸽了康康模拟费用流课件

    论老鼠进洞的亿种做法

    线段树优化费用流

    贪心优化费用流

    堆优化费用流

    • wannafly 挑战赛老鼠进洞
    • IOI2017 wine
    • JAG
    • WF2018

    线性规划与网络流

    未完待续

  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    update chnroute
    An error "Host key verification failed" when you connect to other computer by OSX SSH
    使用dig查询dns解析
    DNS被污染后
    TunnelBroker for EdgeRouter 后记
    mdadm详细使用手册
    关于尼康黄的原因
    Panda3d code in github
    Python实例浅谈之三Python与C/C++相互调用
  • 原文地址:https://www.cnblogs.com/fexuile/p/12203597.html
Copyright © 2020-2023  润新知