Algorithm 具有最小最大边权的路径

Algorithm 具有最小最大边权的路径,algorithm,graph-algorithm,shortest-path,Algorithm,Graph Algorithm,Shortest Path,假设我们有一个有向非负加权图 我们必须找到(u,v)之间的最小成本路径。 路径的成本定义为路径包含的第二个最昂贵的边的最大成本 这里有一个例子 具有4个节点和4条边的图形: 从1到2,成本为3 从1到3,成本为7 从2到3,成本为5 从3到4,成本为2 1和4之间的最佳路径应为1-3-4,总成本为2(成本为2和7,第二高的成本为2) Dijkstra标准SSSP(重建路径并找到第二高边)显然不起作用。 我在MST考虑过(这应该可以),但它不能保证覆盖最佳路径(u,v)。考虑二进制搜索以获得最

假设我们有一个有向非负加权图

我们必须找到(u,v)之间的最小成本路径。 路径的成本定义为路径包含的第二个最昂贵的边的最大成本

这里有一个例子

具有4个节点和4条边的图形:

  • 从1到2,成本为3
  • 从1到3,成本为7
  • 从2到3,成本为5
  • 从3到4,成本为2
1和4之间的最佳路径应为1-3-4,总成本为2(成本为2和7,第二高的成本为2)

Dijkstra标准SSSP(重建路径并找到第二高边)显然不起作用。
我在MST考虑过(这应该可以),但它不能保证覆盖最佳路径(u,v)。

考虑二进制搜索以获得最佳成本。对所有边的权重进行排序,并搜索满足条件的最小值
X

There is a u -> v path which has at most one edge with weight greater than X.
如何检查状况?对于给定的
X

  • u
    运行DFS,并使用最多
    X
    的权重边,查找可从
    u
    访问的顶点集
    u
    。如果
    v
    U
    中,则满足条件

  • 否则,从
    V
    中查找具有DFS的相应集合
    V

  • 当且仅当存在一条边,其中一个顶点在
    U
    中,另一个顶点在
    V
    中时,该条件才满足

  • 时间复杂度:
    O(E log E)

    您可以对答案进行二元搜索(按其前面的权重对边进行排序)。
    对于固定答案c,让我们称重量大于c的边为重边,其他边为轻边。

    所以,您需要检查的是,是否存在最多1条重边的路径。您可以通过将0成本指定给轻边,将1成本指定给重边,并运行0-1 bfs来实现。如果距离我们可以得到O(E+vlogv),这对于足够密集的图是O(E loge)。使用Dijkstra和Fibonacci堆,计算两个最大权重(与第二个最大权重相反)最短路径树,一个从根u指向叶,一个指向根v。对于每个边s>t,考虑由u到s的最大权重最短路径、边s>t和从t到v的最大权重最短路径组成的路径,其中第二个最大权重取u->s和t->V段的最大值。试着自己解决它,然后如果你有问题回来寻求帮助。不是说你需要代码,但至少应该知道如何解决这个问题。如果路径中的边权重是5,5,4,会发生什么?费用是4英镑还是5英镑?另外,如果路径中只有一条边怎么办?很抱歉没有报告尝试。我添加了一些信息@genisage的成本分别为5和0。Dijkstra我猜你是指Prim?@tmyklebu I s'pose,但Prim在有向图上操作的想法似乎比Dijkstra使用不同的松弛公式更刺耳。我猜。不过,我并不认为这两者之间有什么区别。“DaVixIsStAT我认为你的答案更合适,因为它不涉及BSACHACH,但是我无法找到适当的松弛公式来得到最大权重SP(也就是说,最大重量SP树的含义对我来说不是100%)。”Dijkstra算法的工作原理是将顶点存储在优先级队列中,其中顶点的关键点是到达顶点的最便宜已知路径的成本。当计算节点的新成本时,我们所要做的就是用max(length(path)、length(edge))替换length(path)+length(edge),就像Prim的算法一样。(说Prim让我很烦恼,因为有更快的MST算法,但它们在有向图中不起作用。)它在如下图中不起作用:1->2按成本8 2->3按成本1 3->4按成本2 4->5按成本7 3->5按成本9。你的想法会导致答案是2,但正确的结果是7。@lucach你是对的。我已经编辑了我的答案。现在看来这是正确的。