1. 程式人生 > >網路流入門知識詳解

網路流入門知識詳解

轉載部落格

本圖示最大流的一個例項。由此,可以引出最大流的一些基本的定義和概念

一:介紹

1、網路流的相關定義:

  • 源點:有n個點,有m條有向邊,有一個點很特殊,只出不進,叫做源點
  • 匯點:另一個點也很特殊,只進不出,叫做匯點
  • 容量和流量:每條有向邊上有兩個量,容量和流量,從i到j的容量通常用c[i,j]表示,流量則通常是f[i,j].
  • 最大流:把源點比作工廠的話,問題就是求從工廠最大可以發出多少貨物,是不至於超過道路的容量限制,也就是,最大流
  • 通常可以把這些邊想象成水管道,流量就是這條道路的水流量,容量就是道路可承受的最大的水流量。
  • 很顯然的,流量<=容量。
  • 而對於每個不是源點和匯點的點來說,可以類比的想象成沒有儲存功能的貨物的中轉站,所有“進入”他們的流量和等於所有從他本身“出去”的流量。
  • 那麼,我們一定能找到這條路上的每一段的(容量-流量)的值當中的 最小值delta。我們把這條路上每一段的流量都加上這個delta,一定可以保證這個流依然是可行流,這是顯然的。
  • 這樣我們就得到了一個更大的流,他的流量是之前的 流量+delta ,而這條路就叫做增廣路。我們不斷地從起點開始尋找增廣路,每次都對其進行增廣,直到源點和匯點不連通,也就是找不到增廣路為止。
  • 當找不到增廣路的時候,當前的流量就是最大流,這個結論非常重要。

2、

3、一個最簡單的例子就是,零流

,即所有的流量都是0的流。

  • (1).我們就從這個 零流 開始考慮,假如有這麼一條路,這條路從源點開始一直一段一段的連到了匯點,並且,這條路上的每一段都滿足 流量 < 容量,注意,是嚴格的 <,而不是 <=(可以理解成如果等於容量的話,還得去考慮管道的生命力,先簡單的理解一下趴)

4、引出最大流的概念

二、演算法分析:

1、

所以說,演算法的關鍵在於

1)何為增廣路徑,如何找出增廣路徑。

2)如何更新流量

2、增廣矩陣的概念

( f(u,v)是當前的流量, c(u,v)是總的容量 )

說的直白些,所謂增廣路徑,就是找到這樣一條路徑,其流量不滿,未達到容量上限。

所有的可能的增廣路徑在一起便構成了殘留網路。

那麼,如何增廣呢。

3、增廣路

簡單解釋一下:

第一步,計算可增加流量

設某一增廣路徑上的節點為(a1,a2,a3,a4,....,an)

如果(u,v)是正向邊,則增加流量d = min{ c(ai,aj) - f(ai,aj) | j = i +1, i =1,2,3...,n-1}

如果是逆向邊,則增加流量d = min{ f(ai, aj) | j = i +1, i =1,2,3...,n-1}

第二步,更新流量

如果(u,v)是正向邊,則 f(u,v) = f(u,v) + d

是逆向邊,則f(u,v) = f(u,v) - d

注意,如果是逆向邊,就是減法,當前管道從中減去部分流量,而且,伴隨著這部分減去的流量,必有另一部分管道的流量會增加,而且,最後的總流量增加了d

結合上述演算法,可以詳細參閱下下列圖示

可以證明,可行流為最大流,當且僅當不存在新的增廣路徑。

總結一下最大流演算法

如何尋找增廣路徑,採用DFS和BFS的方法。然後在更新流量。