【问题标题】:Algorithm for finding weight of path with lowest weight in weighted directed graph求加权有向图中权重最小路径权重的算法
【发布时间】:2016-07-13 20:04:54
【问题描述】:

给定一个 G=(V,E) 有向图,它的所有边的权重都是“0”或“1”。

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

虽然我想制作一个新图,其中将它们之间的边为 0 的顶点联合起来,然后在其上运行 BFS,但这会破坏图的方向(如果图是无向的或权重为 { 2,1} 并且对于 2 的边,我将创建一个新顶点)。

我将不胜感激。

谢谢

【问题讨论】:

    标签: algorithm graph breadth-first-search


    【解决方案1】:

    这个问题可以修改为单源最短路径问题

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

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

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

    【讨论】:

    • 我需要最轻路径的重量,而不是最小路径的距离。理论上我可以有一个顶点 A 和另一个 v 的图,它们之间有一条权重为“1”的边的路径,另一条有 100 条边的路径权重为“0”,所以算法实际上应该找到 100 条边路径,因为它更轻。你能详细说明你的建议是如何找到重量的(以及它是如何成为 O(V+E) 的吗?因为 Dijkstra 比这更糟。
    【解决方案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) 时间复杂度的要求。

    【讨论】:

    • 感谢您的精心回复,但我需要的是最短路径的权重。我在哪里可以找到这个答案?这里顶点的“dist”参数实际上是权重吗?
    • @AtsrA dist 给出了路径上所有边的权重之和。我希望这就是你要找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2016-04-02
    • 2022-01-22
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多