我在這個主題上看過不少文章(即post1,post2,post3),但沒有文章提供了一種算法來備份相應的查詢。因此我不確定接受這些帖子的答案。
這裏我介紹一種基於BFS的最短路徑(單源)算法,適用於非負加權圖。任何人都可以幫助我理解爲什麼BFS(根據以下基於BFS的算法)不用於這些問題(涉及加權圖)!加權圖的BFS算法 - 查找最短距離
算法:
SingleSourceShortestPath (G, w, s):
//G is graph, w is weight function, s is source vertex
//assume each vertex has 'col' (color), 'd' (distance), and 'p' (predecessor)
properties
Initialize all vertext's color to WHITE, distance to INFINITY (or a large number
larger than any edge's weight, and predecessor to NIL
Q:= initialize an empty queue
s.d=0
s.col=GREY //invariant, only GREY vertex goes inside the Q
Q.enqueue(s) //enqueue 's' to Q
while Q is not empty
u = Q.dequeue() //dequeue in FIFO manner
for each vertex v in adj[u] //adj[u] provides adjacency list of u
if v is WHITE or GREY //candidate for distance update
if u.d + w(u,v) < v.d //w(u,v) gives weight of the
//edge from u to v
v.d=u.d + w(u,v)
v.p=u
if v is WHITE
v.col=GREY //invariant, only GREY in Q
Q.enqueue(v)
end-if
end-if
end-if
end-for
u.col=BLACK //invariant, don't update any field of BLACK vertex.
// i.e. 'd' field is sealed
end-while
運行:據我看到它是O(| V | + | E |)包括初始化成本
如果這算法類似任何現有的,請讓我知道
請詳細說明'**這就是爲什麼BFS不用於......'的原因 - 沒有得到你說的原因! – KGhatak
如果使用隊列而不是優先級隊列,算法會更快並且複雜度更低。但是,對於一些加權圖不會計算最短距離。優先級隊列使Dijkstra算法選擇下一個頂點,以確保爲每個訪問(黑色)頂點計算最短距離。如果使用FIFO隊列,它將無法處理任意的邊權重。你可以在具有圓的小加權圖上找到反例。 –
我已經用循環和自循環進行了測試。我無法理解什麼是「任意」的邊緣權重。你會否提供一個反例! – KGhatak