【问题标题】:algorithm to solve the replacement paths problem for specific situations解决特定情况下替换路径问题的算法
【发布时间】:2019-12-20 17:57:25
【问题描述】:

我必须解决这个问题,它已经困扰了我好几个小时,我似乎找不到满足所需时间复杂度的有效解决方案。

对于任意图G中的任意边e,令G\e表示删除e得到的图> 来自G

(a)假设给定一个边加权有向图G,其中从顶点s到顶点σ em>t 穿过 G 的每个顶点。描述一种算法来计算 G\e 中从 st 的最短路径距离,对于每条边 e G,在 O(VlogV) 时间内。您的算法应该输出一组 E 最短路径距离,输入图的每条边一个。你可以假设所有边的权重都是非负的。[提示:如果我们删除原始最短路径的一条边,新旧最短路径如何重叠?

(b) 描述一种算法,用于在 O(V log V ) 时间内解决任意无向图的替换路径问题。

【问题讨论】:

  • 添加您尝试过的内容以及解决问题的位置总是一个好主意。三个问题/cmets 1) G 是简单图还是可以是多重图? 2)在从原始最短路径中删除一条边后,新的SP是否也应该通过所有顶点? 3) 将时间复杂度表示为 O(VlogV) 以避免与 Dijkstra 的 SP 算法运行时混淆不是更好吗?
  • 我刚刚想到了这个问题以及我可以想到的多种方法来尝试解决它,但是我发现我的方法中有直接错误,所以我认为对于您的问题来说,提及它是没有用的, 1) 是的 G 是一个简单的图,2) 不,最短路径不应该在边缘移除后经过所有节点 3) 我认为复杂度应该是 O(ElogV),因为据我了解算法应该在所有节点上运行在所有情况下计算 G\e 的边。
  • 但是E 并不是您的问题描述中的所有边:您的算法应该输出一组 E 最短路径距离。这意味着E 是原始SP 中的边数,等于V-1
  • 但它写的是:E 最短路径距离,输入图的每条边一个,这意味着E 是输入图@ 的所有边987654325@无论他们最初是否在SP中
  • 如果边缘不在原始 SP 中,则删除它不会改变任何内容

标签: algorithm graph-theory graph-algorithm shortest-path


【解决方案1】:

a) 考虑顶点 s 和 t 之间的最短路径 P。由于 P 是最短路径,因此 P 中的任意两个顶点 u 和 v 之间没有边,其中 u 和 v 之间的最短路径的长度在诱导图 P 中大于 1。由于 G 中的每个顶点都存在于 P 中, 所以 G 的每条边都存在于 P 的诱导图中。所以我们得出结论 G 中的每条边都在 P 中的两个相邻顶点之间(不是 P 的诱导图)。您应该检查连接 G 中的顶点 u 和 v 的每条边 e 的唯一一件事是,是否有另一条边连接 G 中的 u 和 v。如果是这样,则 G/e 中的最短路径不会改变,否则 s并且 t 将位于不同的组件上。

【讨论】:

  • 我认为这只有在 s 和 t 之间的路径应该通过 G/e 中的所有节点时才有效,关于如何在没有这种条件的情况下处理它的任何建议?
【解决方案2】:

首先我想提一下,复杂度不能只取决于 V,因为输出应该包含 E 值,因此我猜它应该是 O(E + Vlog(V))。

我认为以下想法应该适用于问题 b),因此也适用于 a)。设 σ 为最短 s-t 路径。

  1. 对于 G/E(σ) 中的每条边 e,G/e 中的最短路径仍然是 σ。
  2. 如果我们删除 σ 中的一条边 e,那么剩余图中的最短路径将如下所示:它将开始沿 σ 行进,然后将继续向外(可能从第一个顶点 s 开始,然后返回 σ (可能在最后一个顶点 t)然后让我们遍历所有边 e=(u,v),它们要么从 G/σ 到 σ,要么从 σ 的一个顶点,即更接近 s,到另一个顶点σ,即更接近 t,作为 G/e' 中某个 e' 中某个最短 s-t 路径的潜在候选路径的边。假设 w 是最短 s-u 路径 U 中属于 σ 的最后一个顶点。那么 U对于 σ[w..v] 中的所有 e',+e+σ[v..t] 是图 G/e' 中最短 s-t 路径的潜在候选。为了有效地存储这个候选,我们可以使用Segment Tree 具有最小操作的数据结构。在我们考虑所有边之后,这将使我们所有更新的总复杂度为 O(E log(E))。如果我们仔细观察,可能会使其成为 O(Vlog(V))在更新的结构上,但我不确定此刻,可能不是。如果我们已经有 σ,则可以在一次 Dijkstra 运行中为上述每个最短 s-u 路径预先计算顶点 w。

所以最终解决方案在 O(Elog(E)) 时间内运行。我不知道如何使它成为 O(E + Vlog(V)),可以通过使用斐波那契堆使 Dijkstra 在这段时间内运行,但是对于候选人的更新,我并没有真正看到更快的解决方案瞬间。

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2020-08-17
    • 1970-01-01
    • 2018-12-09
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多