繁体   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