我们给出了具有正边缘权重的有向图G(可能具有周期),并且还给出了来自源s的每个顶点D[v]
的最小距离v
(D是这个数组办法)。
问题是从s到v找到长度为N[v] = number
的路径的数组D[v]
,
在线性时间。
现在这是一个我一直在苦苦挣扎的功课问题。我正在按照以下思路工作:我试图通过适当选择G的非循环子图来删除循环,然后尝试在子图中找到从s到v的最短路径。
但是我无法明确地知道要做什么,所以我会感谢任何帮助,就像在做什么的定性想法一样。
答案 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_k
到v0
的路径v_k
最短,则v0->...->v_(k-1)
是从v0
到v_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]
。
请注意,此算法的证明基本上是归纳,将更正式地遵循此解释的指导原则。