【问题标题】:Algorithm for finding the path that minimizes the maximum weight between two nodes寻找使两个节点之间的最大权重最小化的路径的算法
【发布时间】:2015-04-27 16:14:50
【问题描述】:

我想开车从X市到Y市。我的车有一个小油箱,加油站只存在于道路交叉口(交叉口是节点,道路是边缘)。因此,我想采取一条路径,使我在两个加油站之间行驶的最大距离最小化。我可以使用什么有效的算法来找到该路径?蛮力是一种糟糕的解决方案。我想知道是否存在更有效的算法。

【问题讨论】:

    标签: algorithm graph graph-algorithm shortest-path


    【解决方案1】:

    这是一个简单的解决方案:

    1. 按边的权重排序。

    2. 开始一个一个地添加它们(从最轻到最重),直到 XY 连接起来。

    3. 要检查它们是否已连接,您可以使用union-find 数据结构。

    时间复杂度为O(E log E)

    正确性证明:

    1. 正确答案不大于此解决方案返回的答案。之所以如此,是因为解决方案是建设性的:一旦XY 在同一个组件中,我们可以明确地写下它们之间的路径。它不能包含较重的边缘,因为它们尚未添加。

    2. 正确答案不小于此解决方案返回的答案。假设在XY 之间有一条路径,该路径由权重严格小于返回答案的边组成。但这是不可能的,因为之前处理了所有较轻的边缘(我们按排序顺序对其进行迭代)并且 XY 位于不同的组件中。因此,它们之间没有路径。

    1) 和 2) 暗示了该算法的正确性。

    此解决方案适用于无向图。

    这是一个解决有向情况问题的算法(它也适用于无向图):

    1. 让我们按边的权重对边进行排序。

    2. 让我们对路径中最重边的权重进行二分搜索(它由边在所有边的排序列表中的索引确定)。

    3. 对于固定答案候选i,我们可以执行以下操作:

      1. 在排序列表中添加索引不超过i的所有边(即所有不比当前重的边)。

      2. 运行 DFS 或 BFS 以检查是否存在从 XY 的路径。

      3. 根据该路径的存在调整二分查找的左右边界。

    时间复杂度为O((E + V) * log E)(我们运行DFS/BFSlog E次,每个都在O(E + V)时间完成)。

    这是一个伪代码:

    if (X == Y)
        return 0 // We don't need any edges.
    if (Y is not reachable from X using all edges)
        return -1 // No solution.
    edges = a list of edges sorted by their weight in increasing order 
    low = -1 // definitely to small(no edges)
    high = edges.length - 1 // definitely big enough(all edges)
    while (high - low > 1) 
        mid = low + (high - low) / 2
        g = empty graph
        for i = 0...mid
            g.add(edges[i])
        if (g.hasPath(X, Y)) // Checks that there is a path using DFS or BFS
             high = mid
        else
             low = mid
    return edges[high] 
    

    【讨论】:

    • 这似乎是对的。谢谢你。我验证后将其标记为正确,或者您可以提供证明。
    • 另外你能告诉我这个算法叫什么名字吗?
    • @TravelingSalesman 我不知道具体的名称,但它类似于 Kruskal 查找 MST 的算法(但我们停在这里不是得到一棵树,而是当我们找到两个特定顶点之间的路径时)。
    • 很好的答案。会为证明+2(即使它只是一个草图)。只是一件小事:O(E log E) = O(E log V),因为 E 是 O(V^2) 并且,O(E log V^ 2) = O(E 2 log V) = O(E log V)
    • 我认为 set 和 union 对这个版本的问题没有帮助,因为我们正在寻找路径并且图是有向的。我宁愿在每次添加边缘后使用 BFS 来检查 B 是否可以从 A 到达。我认为时间复杂度是 O(E^2)。如果我错了,请纠正我。
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多