簡體   English   中英

具有正權重和循環的有向圖 Dijkstra 算法

[英]Dijkstra's algorithm for directed graph with positive weights and a cycle

如果我有一個帶有循環且只有正權重的有向圖,而不是使用優先隊列,而是使用隊列並繼續添加所有子節點,包括那些因為我選擇不跟蹤訪問者而被訪問的子節點,我的算法是否會落入無限循環? 我無法對此產生直覺,也不確定我的理解是否正確。

為此,請考慮下圖:

在此處輸入圖像描述

並考慮偽代碼,而不跟蹤訪問過的節點。

 1  function Dijkstra(Graph, source):
  2      
  3      for each vertex v in Graph.Vertices:
  4          dist[v] ← INFINITY
  5          prev[v] ← UNDEFINED
  6          add v to Q
  7      dist[source] ← 0
  8      
  9      while Q is not empty:
 10          u ← Q.pop()
 11          remove u from Q
 12          
 13          for each neighbor v of u still in Q:
 14              alt ← dist[u] + Graph.Edges(u, v)
 15              if alt < dist[v]:
 16                  dist[v] ← alt
 17                  prev[v] ← u
 18                  add v to Q
 19
 20      return dist[], prev[]

我們知道我們有一個循環,並假設邊的權重大於零。 通過該算法,我們知道在最多 2 步之后,我們處於從 B 開始的循環中。掃描其鄰居 C,並更新其距離並再次添加其鄰居。 這樣做直到當前節點是 E。此時,我們知道到 E 的距離小於無窮大,並且隊列中有 D 和 F。 我們再次更新 F 的距離,添加其鄰居(為空)並更新 D 的距離。如果我們再次將 D 的鄰居添加到隊列中,則隊列中有 B。 在第 18 行我們可以看到我們只是將節點添加到隊列中,如果前一個節點的距離小於 B 的當前距離。由於我們只有邊權重大於 0,所以距離不可能D 的距離小於 B 的距離。因此,我們不會向隊列中添加任何其他節點,這將使其為空。 如果隊列為空,算法將終止。 如果我們,例如稍微修改算法,我們總是它的鄰居到隊列,是的,可能存在算法不會終止的情況。 但這只是這種情況,如果我們不檢查距離是否更小或不跟蹤訪問過的節點。

長話短說:

如果你有東西要跟蹤程序的當前 state,讓它成為節點的距離或訪問的節點等,你不會遇到任何死循環。 除非邊權重為負。

暫無
暫無

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

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