【问题标题】:Finding all shortest paths from source to all vertices in a digraph查找从源到有向图中所有顶点的所有最短路径
【发布时间】:2013-10-25 15:20:25
【问题描述】:

我们得到了一个具有正边权重的有向图 G(可能带有循环),并且还给出了从源 s 到每个顶点 v 的最小距离 D[v](D 是这样的数组)。 问题是找到从 s 到 v 长度为 D[v] 的路径的数组 N[v] = number, 线性时间。

现在这是一个我一直在努力解决的家庭作业问题。我正在按照以下想法工作:我试图通过适当地选择 G 的非循环子图来删除循环,然后尝试在子图中找到从 s 到 v 的最短路径。

但我无法明确地知道要做什么,所以我很感激任何帮助,比如关于做什么的定性想法。

【问题讨论】:

  • 请注意,如果您添加限制“简单路径”,您可以通过发送D=[n,n,...,n] 来减少哈密顿路径问题。这是一个很好的直觉,通常问题本身也是 NPC,除非你错过了对图形结构的一些限制。
  • @amit, D[v] 是最短路径距离(从 s 到 v)而不是任意距离(并且是给定的)。
  • @SaeedAmiri 不确定我是否在关注。给出了最短距离,你要做的就是找出有多少条最短路径?
  • @amit,我猜是这样,因为我可以读到它是这样说的。 (似乎只是一个计数问题)
  • @amit :是的,所有顶点都给出了到 s 的最短距离。我们必须找到从 s 到 v 的最短路径的数量,但是对于每个 v。

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


【解决方案1】:

你可以在这里使用dynamic programming的方法,并在你走的时候填写路径的数量,如果D[u] + w(u,v) = D[v],类似:

N = [0,...,0]
N[s] = 1 //empty path
For each vertex v, in *ascending* order of `D[v]`:
   for each edge (u,v) such that D[u] < D[v]:
       if D[u] + w(u,v) = D[v]: //just found new shortest paths, using (u,v)!
           N[v] += N[u]

复杂度为O(VlogV + E),假设图不是稀疏的,O(E) 占主导地位。


说明:

如果存在从v0v_k 的最短路径v0-&gt;v1-&gt;...-&gt;v_(k-1)-&gt;v_k,则v0-&gt;...-&gt;v_(k-1) 是从v0v_k-1 的最短路径,因此- 当迭代v_k - N[v_(k-1)] 时已经完全计算(请记住,所有边都有正权重,并且D[V_k-1] &lt; D[v_k],我们正在通过增加D[v] 的值进行迭代)。
因此,此时路径v0-&gt;...-&gt;v_(k-1)计入编号N[V_(k-1)]
由于v0-&gt;...-&gt;v_(k-1)-v_k 是最短路径 - 这意味着D[v_(k-1)] + w(v_k-1,v_k) = D[v_k] - 因此条件成立,我们将把这条路径的计数添加到N[v_k]

请注意,该算法的证明基本上是归纳,将更正式地遵循此解释中的指导方针。

【讨论】:

  • 虽然这是一个优雅的解决方案,但如果它是一个稀疏图,它不会是非线性的吗?我也觉得可能会涉及到动态规划,但是需要严格的线性算法……
  • 我在问题中提到的方法是否有任何寻找合适的子图等的方法? (在这个问题上工作了这么长时间后,我希望涉及这种方法的东西可能会起作用)
  • @UrysohnLemma 没有我能想到的,通常涉及查找子图的事情是一个难题(MST 显然是该声明的例外),但我不知道这里是否也是这种情况。
  • 这在任何意义上都不是 O(n) (仅适用于非常稀疏的图)。 (例如,当我询问输入是否已排序时,我正在考虑一种方法来摆脱 log n 因素)。
  • @SaeedAmiri 如果图不是稀疏的,它在输入的大小中是线性的,也就是图。 [请注意,OP 要求线性,而不是与 n 线性]
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2011-01-26
  • 2015-08-05
  • 2019-02-14
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
相关资源
最近更新 更多