【问题标题】:Finding a path in which the difference between min edge cost and max edge cost is minimum across all routes找到一条路径,其中最小边缘成本和最大边缘成本之间的差异在所有路径中都是最小的
【发布时间】:2017-08-08 11:25:40
【问题描述】:

我们必须在图中找到从源到汇的路线,其中最大成本边和最小成本边之间的差异最小。

我尝试使用递归解决方案,但它会在循环条件下失败,并且修改后的 dijkstra 也失败了。

有没有一种算法可以让我不必找到所有路线然后找到最小值?

【问题讨论】:

  • 当您说“失败”时,您的意思是没有产生正确的解决方案?直觉上,您似乎必须检查从源到接收器的所有路线:如果您不这样做,您如何判断其他路线不能更好地满足条件,除非您已经了解所有边缘图表
  • 是的,它似乎没有给出正确的答案。
  • 但所有路线都将是复杂的东西 2^n 这太慢了
  • 哪里 'n' 是顶点的数量?所以它是一个密集图,其中每个顶点都连接到其他每个顶点?
  • 问题的约束是顶点 = 2000 边 = 4000

标签: algorithm graph


【解决方案1】:

按权重对边进行排序(按非递减顺序),然​​后对每条边执行下一条:添加下一条边(按非递减顺序权重更大或相等的边),直到源和汇连接,然后用最后一条边之间的差异更新您的答案,如下所示:

    ans = INFINITE
    for each Edge e1 in E (sorted by weight in non-decreasing order)
        clear the temporal graph
        for each Edge e2 in E
            if e2.weight >= e1.weight  
                add e2 to the temporal graph
                if sink and source are connected in the temporal graph
                    ans = min(ans, e2.weight - e1.weight)
                    break
    print ans

如果您使用 UNION-FIND 结构添加边并检查源和接收器之间的连通性,您应该得到 O(edges^2) 的总时间

【讨论】:

  • 您可能比O(edges^2) 做得更好,方法是将问题视为“滑动窗口”问题并使用图形数据结构告诉您删除边是否会断开图形(如@ 987654321@)
  • @KevinWang 自从我上次参加比赛以来已经有一段时间了,哈哈,但我想了一下,我认为你是对的 (Y),滑动窗口可以工作,我认为你需要一种结构,可让您检查源汇连接,还可以添加和删除边。如果我错了,请纠正我(Y)
【解决方案2】:

好的,所以您有一个图,并且您需要找到从一个节点(源)到另一个节点(汇)的路径,以使路径上的最大边权重减去路径上的最小边权重最小化。你没有说你的图是有向的,是否有负边权重,或者有循环,所以让我们假设所有这些问题的答案都是“是”。

在计算您的路径“分数”(边权重之间的最大差异)时,我们观察到这些类似于路径距离:您可能有一条从 A 到 B 的路径得分更高(不理想)或更低(理想)。如果我们将路径分数视为路径权重,我们观察到当我们通过添加新边来构建路径时,路径分数(=权重)只会增加:给定路径 A->B->C,其中权重(A->B) =1,权重(B->C)=5,路径得分为4,如果我将边C->D添加到路径A->B->C,路径得分只能增加或保持不变:最小边重和最大边重之差不小于4。

所有这些的结论是,我们可以探索图寻找最佳路径,就好像我们正在寻找没有负边的图中的最佳路径一样。但是,可能存在(并且可能存在,鉴于所描述的连接性)循环。这意味着Dijkstra's algorithm,如果实施得当,将具有相对于我们今天所知道的该图的拓扑结构的最佳性能。

没有全图探索就没有解决方案

人们可能会误以为我们可以在不探索整个图的情况下就哪条边应该属于最佳路径做出局部良好的决策。下面的子图说明了这个问题:

假设您需要一条从 A 到 F 的路径,并且您位于节点 B。鉴于您所知道的一切,您会选择一条到 C 的路径,因为它可以最小化路径分数。你(还)不知道的是,该路径中的下一条边将导致该路径的分数大幅增加。如果你知道你会选择边 B->D 作为最优路径中的下一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多