查找有向图中从源到所有顶点的所有最短路径

时间:2013-10-17 08:22:42

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

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

现在这是一个我一直在苦苦挣扎的功课问题。我正在按照以下思路工作:我试图通过适当选择G的非循环子图来删除循环,然后尝试在子图中找到从s到v的最短路径。

但是我无法明确地知道要做什么,所以我会感谢任何帮助,就像在做什么的定性想法一样。

1 个答案:

答案 0 :(得分:3)

您可以在此处使用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)占主导地位。


<强>解释

如果从v0->v1->...->v_(k-1)->v_kv0的路径v_k最短,则v0->...->v_(k-1)是从v0v_k-1的最短路径,因此 - 当迭代v_k - N[v_(k-1)]已经完全计算时(记住,所有边都有正权重,D[V_k-1] < D[v_k],我们通过增加D[v]的值来迭代。
因此,此时路径v0->...->v_(k-1)计入数字N[V_(k-1)]。 由于v0->...->v_(k-1)-v_k是最短路径 - 它表示D[v_(k-1)] + w(v_k-1,v_k) = D[v_k] - 因此条件将成立,我们会将此路径的计数添加到N[v_k]

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