簡體   English   中英

有向加權邊緣圖及其權重的算法

[英]Algorithm for directed weighted edge graphs and their weights

我有一個有向圖,邊緣上有非負權重。

我的算法應執行以下操作:

  • 獲取從頂點u到頂點v的所有路徑。
  • 計算從u到v的每條路徑上的最小加權邊。
  • 計算我從上面計算出的最小加權邊的最大值。

什么算法對此有好處? 我之所以這么問,是因為我可以天真地執行上述步驟(蠻力)。

我感覺這是對Dijkstra算法的略微修改,但我不確定。 另外,時間復雜度是多少?

我認為我們這里不需要dijkstra。 假設我們選擇了具有所需的最小最大邊緣的路徑。 它顯然不包括權重較小的邊。 所以算法是

  • 選擇K最重的邊緣
  • 使用dfs / bfs來檢查u是否可以通過此邊緣到達vf(K) is true
  • 如果K1>K2並且f(K2) is true ,則顯然f(K1) is true
  • 這樣我們就可以對K執行二進制搜索

時間復雜度為O((N+M) log M) ,其中N頂點數和M邊數

任何真正考慮從u到v的所有路徑的算法都將花費指數時間,因為這種路徑的數量是指數的-考慮一個梯子或2xN節點的網格-從一端到另一端沿着您的長維度具有至少N個獨立的選擇,因此至少2 ^ N個可能的路徑。

我認為您可以修改Dijkstra的算法來做到這一點。 https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Pseudocode中有偽代碼。 作為第一個修改,更改第6行以將所有初始距離設置為零。 我們需要考慮不變量,我們的第一個不變量可以是dist [v]是至v的路徑中的最小邊的最大值,對於到目前為止已看到的所有路徑。 和之前一樣,我們將prev [v]設置為undefined並將v添加到Q,該隊列保存當前正在考慮的所有節點。 作為初始化的最后一部分,我們設置dist [source] = infinity-而不是0。您可以將其視為hack,也可以將其定義為從v到v的長度為0的路徑中的最小邊長度,沒有任何優勢。

現在,我們擁有Q包含所有仍在考慮最小邊的最大值的節點,並且所有此類節點的該值只會不斷增加。 現在我們從Q中刪除具有dist [u]最大值的節點u-這是第13步,將min更改為max。 對於u的每個鄰居v,我們計算min(dist [v],length(u,v))。 這是沿從源到u的任何路徑上最大可能的最小邊長的新候選者,因此,如果它大於dist [u],則將dist [u]設置為該值。 請注意,這意味着Q的元素u都不會將dist [u]的值設置為大於我們剛剛刪除的Q的元素v的dist [v]的值,這是隊列中的最大值那時候。 這意味着,一旦我們從隊列中刪除了元素v,它的值dist [v]就已經確定好了,以后的任何計算都不能增加。 請注意,我們剛剛更改了隊列Q中某個節點的dist [u]。如果Q是使用諸如優先級隊列之類的數據結構實現的,則這可能意味着該實現將必須在舊版本的優先級隊列中刪除u值dist [u],然后在dist [u]的新值下重新插入。

正確性來自於不變量-每次使dist [v]沿到目前為止所考慮的每條路徑的最小邊的最大值dist,並且當我們從隊列中刪除v時,我們都知道-因為它對於仍然存在於隊列中的所有對象都具有最大值隊列-我們可以考慮的其他路徑都無法更改該值。

出於相同的原因,執行此操作所需的時間與Dijkstra相同。 首先,我們將每個元素輸入隊列一次,然后將每個元素從隊列中刪除一次。 這告訴我們在第14行中執行了多少次刪除操作。

(要計算最小加權邊的最大值似乎很奇怪-這里是否有有趣的應用程序,還是讓您考慮Dijkstra算法的人工練習?)

暫無
暫無

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

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