• 网络流算法(Ford-fulkerson方法)


    一. 预备知识

    1. 流网络:

    有向图G=(V,E)满足(1)存在无入边的源结点s(2)存在无出边的目标点t(3)每条边e都有一个非负容量ci

    2. 流

    流网络中从s-t的流是一个实值函数 f ,满足

    3. 余图(残存网络)

    对于流网络G,边容量为c,流为f,则定义残存容量cf 为

     即,对每一条边,正向记为:c - f,逆向记为:f

    图(a)为一个流网络,图(b)展示了它的余图 

    4. 增广路径

    在余图中找到一条s~>t最大流量的路径,该路径为增广路径

    上图(b)中s-v2-v3-t,容量为4的路径即为增广路径

    5. 流网络的切割

    流网络G中的一个切割(S,T)将结点集合V划分为S和T=V-S两个集合,满足s€S,t€T。

    • 切割的净流量:

                        

    • 切割的容量:

                        

    推论:流和割弱对偶关系

    给定流网络 G=(V,E),s是源,t是汇.  设f是G上的 一个流,S,T是G的任意一个切割,则f(S,T)=| f |.

    给定流网络 G=(V,E). 设f是G上的一个流,S,T 是G的任意一个割,则| f | <= c(S,T)

    二.最大流算法(基本的Ford-fulkerson方法)

    1. 思路:

    (1)初始化:对所有的e,f( e ) = 0

    (2)while迭代:

                            只要G的余图中存在增广路径P,沿着P更新 流 和 余图

            直到不存在P

    (3) 得到最大流

    2. 定理

    3. 算法正确性证明

    (1)可终止性:不妨将容量放缩,乘一个系数使之成为整数,则每次流至少增加整数1,则可终止

    (2)时间复杂度:O(mC),m:边的数量,C:最大流 | f |。

    (3)正确性:

    设FF算法在流 f 上停止

    则,不存在s - t 的路径P,即s 与 t不连通

    设:与s连通的点集为S,

    则(S,V-S)是G的一个切割

    对任意的u€S,v€V-S,f(u,v) = c(u,v)

    则| f | = c(S,T)

    而| f | <= c(S,T)

    则f是最大流。

    4. 算法改进:

    --算法优劣主要取决于寻找增广路径的时间复杂度

     

  • 相关阅读:
    关于BindingSource的ListChange事件
    .Net 中Textbox控件的数据绑定
    Google Chrome OS Open Source Project Announcement
    ajax从基础开始
    如何处理Windows Forms程序中未处理的异常
    Chrome的一个bug? 大家看看
    Extjs学习笔记之二——初识Extjs之Form
    SQLite3简介及在.Net程序中的使用
    Extjs学习笔记之一——初识Extjs之MessageBox
    Extjs学习笔记之三——更多的表单项
  • 原文地址:https://www.cnblogs.com/duanshuai/p/13177183.html
Copyright © 2020-2023  润新知