zoukankan      html  css  js  c++  java
  • 网络流知识点汇总

    最大流:

    (1)最大流定义:

    在容量网络中,满足弧流量限制条件,且满足平衡条件并且具有最大流量的可行流,称为网络最大流,简称最大流。

    (2)最大流判断两点之间是否有流量:

    通过判断它的逆向边是否有流来实现。

    费用流:

    (1)费用流定义:

    费用流,也叫作最小费用最大流,是指在普通的网络流图中,每条边的流量都有一个单价,求出一组可行解,使得在满足它是最大流的情况下,总的费用最小。 

    (2)最大费用最大流的解法:
    1.把所有费用变成相反数跑一遍最小费用最大流,输出答案的相反数。

    2.初始化spfa时dis数组全从INF改为-INF,松弛的条件从 dis[i]>dis[j]+cost[i,j]改为dis[i]<dis[j]+cost[i,j] 。

    最小割:

    (1)最小割定义:

    假设在原图中,删掉某些边,能够使得从s出发到不了t,则这些边的集合被称作图的割。 定义最小割,为容量和最小的割。

    (2)最大流最小割定理:

    最大流最小割定理是网络流理论的重要定理。是指在一个网络流中,能够从源点到达汇点的最大流量等于如果从网络中移除就能够导致网络流中断的边的集合的最小容量和。即在任何网络中,最大流的值等于最小割的容量。

    (3)输出最小割:

    若是要输出最小割,在最后dinic算法结束的残留网络中,从源点寻找所有与源点仍然连接的点,并打上标记。这样若某一条边的两个端点,一个带标记,一个不带标记,则这条边可以作为最小割的边删去。我个人理解这样删去的边应该是第一阶段满流的那几条边。这样删除的边最后肯定是满足最小割的,但是边数可能不是最少的。

    (4)求最小割且割数最小:
    跑两遍dinic,第一遍跑最大流,求得最小割是多少,第二遍把第一遍中满流的边权设为1,其他设为inf,再跑一边最小割,求得最少需要割去几条边。

    最大权闭合子图:

    (1)定义:

    一个子图(点集), 如果它的所有的出边都在这个子图当中,那么它就是闭合子图。 点权和最大的闭合子图就是最大闭合子图。
    (2)求最大权闭合子图:

    设s为源点,t为汇点。使s连向所有的正权点,边权为点权。使所有负权点连向t,边权为点权的绝对值。若要选x必须先选y,连一条由x到y的边,边权是INF。最大点权和=正权点和-最小割。

    (3)输出最大权闭合子图:

    最大权闭合子图的问题可以转化为求解最小割的问题,我们所求的闭合子图是最小割产生的两个子图中,与源点连接的那个子图。最大权闭合子图的题目很特殊,它的最小割的边都是与源点或者汇点直接相连,如果答案的方法是唯一的话,那么最小割应该也是唯一的(个人猜测),这样的话在dinic之后从源点开始遍历与源点仍然连接的点,这些点都是最大权闭合子图中的点。

    DAG最小路径覆盖:

    (1)定义:

    在一个有向无环图中,找出最少的路径,使得这些路径经过了所有的点,且这些路径之间不会经过相同的点。

    (2)求最小路径覆盖:

    把原图的每个点V拆成VxVy两个点,如果有一条有向边A->B,那么就加边Ax>By。这样就得到了一个二分图。那么最小路径覆盖=原图的结点数-新图的最大匹配数。

    证明:

    一开始每个点都是独立的为一条路径,总共有n条不相交路径。我们每次在二分图里找一条匹配边就相当于把两条路径合成了一条路径,也就相当于路径数减少了1。所以找到了几条匹配边,路径数就减少了多少。所以有最小路径覆盖=原图的结点数-新图的最大匹配数。因为路径之间不能有公共点,所以加的边之间也不能有公共点,这就是匹配的定义。

    (3)输出每条路径上的点:

    考虑我们是如何求最小路径覆盖的,我们一开始认为路径集合就是点集,然后找到一个匹配边,把这个边的两个点所在的集合合并成一个集合(其实就是把两条路径合并成一条路径)。如果最大匹配是用最大流写的,则最后判断某两个点是否在一条路径上,就直接判断它们的反向边是否有流量(注意这里的两个点并不是任意的两个点,而是一条路径上相邻的两个点)。这样按照某种顺序就可以按顺序输出每条边上的点。

    二分图多重匹配:

    (1)定义:

    在二分图最大匹配中,每个点(不管是X点还是Y点)最多只能和一条匹配边相关联,然而,我们经常遇到这种问题,即二分图匹配中一个点可以和多条匹配边相关联,但有上限,或者说,Li表示点i最多可以和多少条匹配边相关联。
    二分图多重匹配分为二分图多重最大匹配与二分图多重最优匹配两种,分别可以用最大流与最大费用最大流解决。

    (2)二分图多重最大匹配:

    在原图上建立源点S和汇点T,S向每个X点连一条容量为该X点L值的边,每个Y点向T连一条容量为该Y点L值的边,原来二分图中各边在新的网络中仍存在,容量为1(若该边可以使用多次则容量大于1),求该网络的最大流,就是该二分图多重最大匹配的值。

    (3)二分图多重最优匹配:
    在原图上建立源点S和汇点T,S向每个X点连一条容量为该X点L值、费用为0的边,每个Y点向T连一条容量为该Y点L值、费用为0的边,原来二分图中各边在新的网络中仍存在,容量为1(若该边可以使用多次则容量大于1),费用为该边的权值。求该网络的最大费用最大流,就是该二分图多重最优匹配的值。

    二分图最小点覆盖:

    (1)定义:

    最小点覆盖要求选最少的点让二分图中的每条边都至少和其中一个点关联。可以证明:最少的点数(即覆盖数)=最大匹配数。

    (2)求出最小点覆盖集:

    将二分图点集分为左右两个点集,标记右边未匹配边的顶点,并从右边未匹配边的顶点出发,按照边:未匹配->匹配->未匹配...,的原则标记途中经过的顶点,则最后一条经过的边必定为匹配边。重复上述过程,直到右边不再含有未匹配边的点。记得到的左边已标记的点和右边未标记的点为S, S即为所求的最小顶点集。

    证明参考:

    http://www.matrix67.com/blog/archives/116

    https://www.cnblogs.com/Gster/p/4994222.html

    (3)二分图最大点独立集

    最大点独立集=总点数-最小点覆盖集。

    证明参考:

    https://blog.csdn.net/Techmonster/article/details/50011363

    (4)二分图最小边覆盖

    最小边覆盖 = 最大点独立集 = 总点数 - 二分图最大匹配。

     二分图最小点权覆盖:

    (1)定义:

    对于有点权的二分图,选出权值和最小的点的集合覆盖所有的边。

    (2)求最小点权覆盖:

    建立源点S,汇点T,源汇点分别与原二分图的各部分连边,容量为点权,原来二分图中的边保持不变,并将其容量改为INF。则此图的最小割就是最小点权覆盖。

    且最小割中的边对应的点,就是最小点权覆盖集中的点。

    (3)二分图最大点权独立集:

    二分图点权最大独立集=二分图点权和-二分图最小点权覆盖集。

  • 相关阅读:
    docker知识复习
    记住left join最简单的方式(转)
    ingress rewrite 配置文件的结构 + server_name和location这两条指令的配置来匹配要 虚拟主机
    PAM unable to dlopen(/lib/security/pam_limits.so): /lib/security/pam_limits.so: wrong ELF class: ELFCLASS32
    iRedMail退信问题的解决(转)
    curl NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)
    看进程的启动时间长度 + vmstat + jstack 应用
    Nginx日志中的金矿
    php-fpm参数优化
    PHP扩展--opcache安装及配置
  • 原文地址:https://www.cnblogs.com/tian-luo/p/9526349.html
Copyright © 2011-2022 走看看