zoukankan      html  css  js  c++  java
  • 网络流系列(算法流程)

    只有算法流程没有推导过程,自己复习用的

    1.最大流

    Dinic算法

    Bfs: 用对于所有\((u,v,w)\in E ,w>0\)的边,构造分层图 ,统计\(dis[..]\)数组

    Dfs: 模拟流的进行,只在分层之间的边之间转移,注意利用\(dis\)数组把没有更多流量的点标记掉

    Dinic:每次Bfs分层之后不断Dfs直到没有增广路

    方案:直接访问最大流的边权得到方案

    2.最小割

    求法同最大流

    方案:Bfs之后看出每个点与S是否联通

    3.费用流

    EK费用流

    初始化:反边的代价为相反数

    SPFA:以代价为边权,用\(w>0\)的边,费用为边权跑出最短路\(dis[..]\)

    Dfs:每次Dfs前清空标记,在最短路/最长路间模拟,每次访问都打标记(图不是拓扑图,防止被卡在环上)

    EK: 注意答案是$dis[T]\cdot $增广长度,每次SPFA之后一直增广直到不存在

    Dijkstra费用流

    先用Johnson算法重置边权,然后跑EK

    4.上下界网络流

    $E=\lbrace (u,v,L,R) \rbrace $

    无源汇循环流

    加入源汇点\(S,T\)

    假定每条边都先取\(L\),求出每个点的入流量和出流量\(ind_i,outd_i\),对于\(ind_i>outd_i\)的连\(S\)\(i\)的边,否则连\(i\)\(T\)的边,权值为\(|ind_i-outd_i|\),同时原图中的边权变为\(R-L\)

    Dinic之后,如果所有与\(S,T\)相连的边满流则存在一个可行的循环流

    有源汇可行流

    连一条\(T\)\(S\)\([0,+\infin)\)的边,然后对于图求出一个可行的循环流,去掉\(T\)\(S\)的边之后就是一个可行流

    有源汇最小流

    在可行流的基础上,对于原图上的残量网络,跑出\(T\rightarrow S\)的最大流减去即可

    有源汇最大流

    在可行流的基础上,对于原图上的残量网络,跑出\(S\rightarrow T\)的最大流加上即可

  • 相关阅读:
    UPC2018组队训练赛第二场
    杭电多校训练第十场
    socks5 代理
    windows pip 报错Unable to find vcvarsall.bat
    emacs笔记
    homestead oci8
    pyenv install
    chrome 设置sock5代理
    laravel 接收post json
    laravel 使用已有数据库自动创建model
  • 原文地址:https://www.cnblogs.com/chasedeath/p/12715701.html
Copyright © 2011-2022 走看看