1. 程式人生 > >最大網絡流

最大網絡流

ble tab 起點 body 連通圖 函數 容量 找到 可能

問題定義

流網絡

  • 圖G=(V,E):有向圖、連通圖
  • 容量:每條邊(u, v)∈G有非負的容量值c(u, v),表示該邊的流量最大值
  • 反平行邊:兩條邊的起點和終點相反,(u, v)和(v, u)是反平行
    • 圖中不允許有反平行邊,也就是有邊(u, v),則不存在反方向的邊(v, u)
    • 圖中不允許自循環
  • 圖中有兩個點源結點s和匯點t。源結點是網絡流的起點,匯點是流的終點

G中流

  • 一個實值函數f:V x V -> R,兩個點間的流量

  • 性質1——容量限制:每條邊上的流不超過容量。對於所有結點u, v∈V,要求0≤f(u, v)≤c(u v)

  • 性質2——流量守恒
    :除了源結點和匯點,每個點的流入量=流出量

最大流問題

給定一個流網絡G、一個源結點s、一個匯點t,找到值最大的一個流

定義:出發點為源點,接受流量 的匯聚點為匯點,邊上的權值為可以流過的最大值

幾個關鍵定義

殘存網絡Gf:由仍可以對流量進行增加/減少的邊構成(流過的量不超過容量的邊),包含原圖中的邊,以及可能包含對應的反向邊

殘存容量cf:一條邊還可以增加的最大流量(與容量c不同,c表示的是一開始就確定的流量最大值)

技術分享

由cf再定義一次Gf:cf>0的邊

為什麽要在Gf中加反向邊?

通過增加反向邊,讓我們可以撤銷原來的流量操作。為什麽要撤銷呢?

來自《數據結構與算法分析》上的一個例子

原圖 流圖(原圖上的流) 殘余網絡
技術分享 技術分享 技術分享

殘余網絡中沒有增加反向邊

s->t沒有新的可達路徑

算法結束,但沒有達到目的

(得到最大流)

原來的網絡流圖

0/5表示邊的容量為5

圖中每條邊上流量的一個狀態

選擇一條可達路徑s-a-d-t

發送流量=3到這條路徑上

技術分享

增加了反向邊,

s->t存在新的可達路徑

原來s-a-d-t的流撤銷一部分

被撤銷的部分可以分流到其它路徑

增廣路徑:給定流網絡G=(V, E),增廣路徑是殘存網絡中一條從源結點到匯點的簡單路徑(沒有分支)

流網絡的切割

流網絡G=(V, E)的一個切割就是將結點集合劃分成兩個集合S和T

(T=V-S)

  • 切割(S, T)的容量:集合S中每個點到集合T中每個點的容量之和

技術分享

  • 最小切割:網絡中容量最小的切割
  • 最大流最小切割定理

設f為流網絡G=(V, E)中的一個流,該流網絡的源結點為s,匯點為t,則下面的條件等價

    • f是G的一個最大流
    • 殘存網絡Gf不包括任何增廣路徑
    • |f|=c(S, T) 流網絡中任意流都不能超過任意切割的容量

Ford-Fulkerson方法

基本步驟

  1. 尋找一條增廣路徑p,用p來對流進行修改(增加)
  2. 直到沒有任何增廣路徑

整理了一下概念,接下來找找例子再補一下

參考

1. 《算法導論》原書第3版

2. 《數據算法與算法分析——C語言描述》原書第2版

最大網絡流