zoukankan      html  css  js  c++  java
  • 网络流初步总结

    为什么写这篇文章,早在很早之前就有接触图论的知识,多多少少走了很多的弯路。
    也请教了好多大牛,对于图论,这个重要的知识点,大多是理解的比较含糊不清。
    有时候,好多人说,图论不就是套模板的事情吗?是的,对于一般的竞赛选手,也只是会套模板。
    甚至,对于不是做acm竞赛的人来说,这些知识点,我只要知道,传入什么值,给我什么样的结果
    就行了,只知其然,不知其所以然。

    看了看刘汝佳的书,参考了一下,对于网络流这一部分来说,其算法本身,可以说是一门艺术。
    由于水平有限,网络流的应用十分广泛,这里我介绍一下,网络流的初步。以后有了比较好的认识,再
    作补充。

    1、最大流问题。(Maximum-Flow)
    描叙:由于网络边上有一个属性——容量,所以产生了,从起点到汇点的最大流的问题。

    解法:
      1、增广路定理:在残余网络上,如果存在一条可行流,那么一定可以沿着这条可行流
    增广,流量增大,流量的增加量就是,这条可行流的瓶颈。
      2、EK算法:就是利用这一特点,不停的在残余网络上找可行流,(手段是:BFS),直到
    找不到这样的可行流,注意的是,每次找到可行流,就要更新残余网络。
      3、Dinic算法:也是利用增广路定理,在EK算法上优化,怎么优化呢?就是预先将残余网络
    分层(手段是:BFS),然后沿着层次图,找可行流(手段是:DFS);

    2、最小割最大流定理。

      很早就听说过了,最小割 = 最大流。其中的原因是值得思考的。记得hihocode上有一个题目就是求这个最小割集。

      首先,为什么会有最小割 = 最大流呢?
      割的定义:S,T两个集合,如果将这两个集合之间的边都删掉,整个集合就被分成了(S,T),成为
    s-t割。他的容量c(s,t) 为他们之间的边的容量之和。显然可以知道c(s,t)>=f(s,t)的。
      当我们找到最大流的时候,整张图,可以分成两个集合S,T,哪两个呢? a[u]>0的集合为S,a数组是可修改量
    那么这两个集合有什么特点,就是,从 T 到 S 的流量为 0 ,f(S,T) = C(S,T)的,这样,和之前的 C(S,T)>=F(S,T)
    相比,我们就找到了使得等号成立的解了,就是 a[u] > 0 的 S集合。这个 C 也是最小的

    3、最小费用最大流。(MCMF)
      给网络流加一个属性:费用。每条边上,每通过一个单位流量的费用cost;
      问题:从起点到终点,在总流量最大的前提下,总费用最小的流。

      解法:
      费用是每条边都要给的,不仅要找到瓶颈,还得知道单位流量需要的费用。这里我们就想到了最短路。
    那么费用就是d[t]*a[t];

  • 相关阅读:
    抽象工厂模式
    观察者模式
    建造者模式
    外观模式
    drf 之路由
    drf之视图
    drf--请求和响应
    def--序列化
    drf之restful规范
    Tepora使用
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6155499.html
Copyright © 2011-2022 走看看