加权有向图中权重最小路径权重的算法

时间:2016-03-26 01:22:19

标签: algorithm graph breadth-first-search

我得到了G =(V,E)有向图,并且它的所有边都具有“0”或“1”的权重。

我在图中给出了一个名为“A”的顶点,对于V中的每个v,我需要找到从A到v的路径权重,该路径的权重最小O(V + E) 。 我只能使用BFS或DFS(虽然这可能是BFS问题)。

我想创建一个新图形,其中边缘为0的顶点合并在一起,然后在其上运行BFS,但这会破坏图形方向(如果图形是无向的或权重为{ 2,1}和2的边缘我会创建一个新的顶点。

我将不胜感激任何帮助。

由于

2 个答案:

答案 0 :(得分:1)

我认为可以通过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)时间复杂度的要求。

答案 1 :(得分:0)

此问题可以修改为单源最短路径的问题。

您只需要反转所有边缘方向,并找到每个顶点v与顶点A的最小距离。

可以很容易地观察到,如果在初始图中,如果我们从某个顶点v到A的路径最小,则在改变边缘方向后,我们将具有从A到v的相同最小路径。

这可以简单地通过Dijkstra OR完成,因为边只有两个值{0和1},它也可以通过修改的BFS完成(首先转到距离为0的顶点,然后是1,然后2等等。)。