[英]Algorithm for finding weight of path with lowest weight in weighted directed graph
我得到一個 G=(V,E) 有向圖,它的所有邊的權重都是“0”或“1”。
我在圖中給出了一個名為“A”的頂點,對於 V 中的每個 v,我需要找到從 A 到 v 的路徑的權重,該路徑在 O(V+E) 時間內具有最低權重。 我必須只使用 BFS 或 DFS(盡管這可能是 BFS 問題)。
我雖然想制作一個新圖,其中它們之間的邊為 0 的頂點被合並,然后在其上運行 BFS,但這會破壞圖的方向(如果圖是無向圖或權重為 {2,1,這將起作用並且對於 2 的邊緣,我將創建一個新頂點)。
我將不勝感激任何幫助。
謝謝
我認為可以通過 DFS 和 BFS 的組合來完成。
在未加權圖的原始 BFS 中,我們有一個不變式,即未探索的節點的距離與探索的節點的距離更大或相等。
在我們的 BFS 中,對於每個節點,我們首先通過所有 0 加權邊進行 DFS,標記距離,並將其標記為已探索。 然后我們可以繼續我們 BFS 中的其他節點。
Array Seen[] = false
Empty queue Q
E' = {(a, b) | (a, b) = 0 and (a, b) is of E}
DFS(V, E', u)
for each v is adjacent to u in E' // (u, v) has an edge weighted 0
if Seen[v] = false
v.dist = u.dist
DFS(V, E', v)
Seen[u] = true
Enqueue(Q, u)
BFS(V, E, source)
Enqueue(Q, source)
source.dist = 0
DFS(V, E', source)
while (Q is not empty)
u = Dequeue(Q)
for each v is adjacent to u in E
if Seen[v] = false
v.dist = u.dist + 1
Enqueue(Q, v)
Seen[u] = true
運行 BFS 后,它可以為您提供與節點源的最短距離。 如果您只想要到單個節點的最短距離,只需在看到目標節點時終止即可。 是的,它滿足 O(V+E) 時間復雜度的要求。
這個問題可以修改為Single Source Shortest Path的問題。
您只需要反轉所有邊緣方向並找到每個頂點 v 與頂點 A 的最小距離。
可以很容易地觀察到,如果在初始圖中,如果我們有從某個頂點 v 到 A 的最小路徑,在改變邊方向后,我們將有相同的從 A 到 v 的最小路徑。
這可以通過Dijkstra或因為邊緣只有兩個值 {0 和 1} 來完成,也可以通過修改的 BFS 完成(首先轉到距離為 0 的頂點,然后是 1,然后是 2 等等。)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.