迪尼茨演算法(英語:Dinic's algorithm)是在網路流計算最大流的強多項式複雜度的演算法,設想由以色列電腦科學家葉菲姆·迪尼茨在1970年提出。[1]演算法的時間複雜度類似於埃德蒙茲-卡普演算法,其時間複雜度為,迪尼茨演算法與埃德蒙茲-卡普演算法的不同之處在於它每輪演算法都選擇最短的可行路徑進行增廣。迪尼茨演算法中採用高度標號(level graph)以及阻塞流(blocking flow)實現效能。
歷史
迪尼茨在格奧爾吉·阿傑爾松-韋利斯基(AVL樹的發明者之一)的演算法課的課前活動上發明了這個演算法。當時他不知道關於福特-富爾克森演算法的基本事實。[2]
迪尼茨在1969年一月向他人公布了他發明的演算法,又在1970年將其發布在《Doklady Akademii nauk SSSR雜誌》。在1974年,希蒙·埃文和(他之後的博士學生)Alon Itai在海法的以色列理工學院對迪尼茨的演算法以及亞歷山大·卡爾扎諾夫的阻塞流的想法很感興趣。但是雜誌上的文章每篇的篇幅被限制在四頁以內,很多細節都被忽略,這導致他們很難根據文章還原出演算法。但他們沒有放棄,在後三天不斷地努力,設法了解這兩個檔案中的分層網路的維護問題。在接下來的幾年,Even由於在講學中將Dinitz念為Dinic,導致Dinic演算法反而成為了它的名稱。埃文和Itai也將演算法與BFS和DFS結合起來,形成了目前版本的演算法。[3]
在福特-富爾克森演算法發明後約十年之內,是否有演算法能在多項式複雜度之內處理無理數邊權是未知的。這造成缺乏任何已知的多項式複雜度演算法解決最大流問題。 迪尼茨演算法和埃德蒙茲-卡普演算法在1972年發布,證明在福特-富爾克森演算法中,如果每次總選擇最短的一條增廣路,路徑長度將單調增加,且演算法總能終止。
定義
設為一個每條邊的容量為,流為的網路。
- 殘留容量的定義為:
- 如果,
- 否則。
- 如果,
- 則殘留網路為,其中
- .
- 增廣路指通過殘留網路的從源點到匯點的一條有效路徑。
- 定義為中從源點到點的最短距離。那麼的高度標號為,其中
- .
- 設圖,其中不包含從到的路徑,則阻塞流為一條從到的流。
演算法
迪尼茨演算法
- 輸入:網路。
- 輸出:的流的最大值。
- 對每條邊,設。
- 在圖的殘留網路中計算。如果停止程式並輸出.
- 在找到一條阻塞流。
- 將增加並返回第二步。
分析
可以證明每輪演算法中找到的阻塞流的邊數至少增加1,因此整個網路中最多有條阻塞流, 為網路中頂點的數量。高度標號可以在的時間複雜度內用BFS構建,一條阻塞流可以在的複雜度內構建。因此,演算法的時間複雜度為.
使用一種叫做動態樹的資料結構,找到阻塞流的時間複雜度可以降到,此時迪尼茨演算法的複雜度可以降到.
在具有單位容量的網路中,迪尼茨演算法可以在更短的時間內輸出結果。每條阻塞流可以在的時間內構建,並且階段(phases)的數量不超過或。此時演算法的複雜度為。[4]
在二分圖匹配問題的網路中,階段的數量不超過,演算法的時間複雜度不超過。這種演算法又叫霍普克羅夫特-卡普演算法。同樣的上界也適用於更一般情況,即unit網路——網路中除源點及匯點外的頂點,都僅有一條容量為1的外向邊,或是僅有一條容量為1的內向邊,並且所有的容量限制都是整數。[5]
參考文獻
參見
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.