[英]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.