簡體   English   中英

網絡流:添加新優勢

[英]Network Flow: Adding a new edge

最近,有人要求我設計一種算法, for a network having V vertices and E edges, if by adding an edge (it's capacity should be 1) results in increase the maximum flow. 那就是我們必須設計這樣的算法來找到這樣的邊緣。

算法應該比O(|E|* h(|V||E|))更快,其中h(|V||E|)是計算最大流量所需的時間。

提前致謝。 讓我知道是否不清楚。

(Philip所說的正確版本。)計算最大流量。 提取一個無能力的有向圖,該圖由具有正剩余容量的弧組成。 當且僅當存在從源頭到尾巴以及從頭到水槽的路徑時,添加特定的電弧會增加最大流量,即,引入電弧會產生增加路徑。

在您的示例{s->a, a->b, a->c, a->d, b->t, c->t, d->t} ,最大流量為s-3>a, a-1>b, a-1>c, a-1>d, b-1>t, c-1>t, d-1>t ,並且殘差圖具有每個后向弧{a->s, b->a, c->a, d->a, t->b, t->c, t->d} s可以到達的頂點是{s} ,從t可以到達的頂點是{t} ,所以唯一可以增加最大流量的弧是s->t

根據最大流最小切定理[1],網絡中的最大流等於最小割中所有邊緣權重的總和。 因此,解決方案可能如下所示:

  • 通過使用Edmonds-Karp-Algorithm(福特-Fulkerson-Algorithm的專門技術)找到總邊緣權重為X的最小切口。 根據[1],這在O(h|V||E|)
  • 添加一條邊緣,該邊緣連接屬於切割(S, S')不同分區的節點,即添加一條邊緣(u,v) ,其中uSvS'
  • 重復該操作,直到不再有總邊緣權重為X切口為止。

我認為解決方案可以是:

  1. 首次運行最大流量算法。 現在,我們有殘差圖G。
  2. 然后我們找到所有邊(u,v),以便在殘差圖G中找到從s到u的路徑以及從v到t的路徑。

最壞情況下的復雜度為O(| V | ^ 2(| V | + | E |)+ h(| V || E |))。

另一個解決方案可能是以下方法:

步驟1.找到包含最小頂點數量的最小切割(稱其頂點Vmin)。

第2步。找到包含最大頂點數量的最小切割(稱為頂點Vmax)。

第三步。 查找鏈接Vmin和V \\ Vmax但不屬於E的所有邊。

為什么這樣做? (I)添加一個新的uv邊緣是好事,因為它包含在每個最小切割中(准確地說:如果它鏈接了最小切割的不同組成部分),並且(II)最小切割的“組”接近於並集和路口。

復雜:

對於步驟1,2,我發現了以下很好的算法: 如何使用最大流量算法找到圖形上的最小割口? 這可用於查找具有最小和最大頂點的最小切割。 這似乎在h(| E || V |)+ O(| V | ^ 3)中運行,其中當您檢查BFS是否結束時(即不再更新),O(| V | ^ 3)來自BFS。存在剩余的相鄰對象)。

對於步驟3,具有O(| Vmin | * | V \\ Vmax |),即O(| V | ^ 2)。

因此,步驟1,2,3 = h(| E || V |)+ O(| V | ^ 3)

請注意,這只是一個簡單的草圖:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM