簡體   English   中英

求加權有向圖中權重最低的路徑權重的算法

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

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