假设我有顶点u
和v
以及一些数字n
。
如何计算每两个顶点之间有一条边的最短顶点序列的长度(边的权重之和)?
例如:
(u, e_1, u_2, e_2, ..., e_n, v)
序列以顶点u
开头,以顶点v
结尾,并且边缘为n
。
答案 0 :(得分:3)
由于允许重复,这可以通过Bellman-Ford算法的微小变化在多项式时间内求解。设OPT(v,i)表示使用i边缘到达v的最优成本,并且令w(x,y)表示顶点x和y之间的权重。然后我们有以下重复:
OPT(v,i + 1)= min {OPT(u,i)+ w(u,v)},在所有边(u,v)上。
这可以在O(nm)中以自下而上的方式解决,其中m是边数。这是伪代码。
function computeShortestPath (u, v, n):
foreach q in vertices:
OPT[q][0] = inf;
OPT[u][0] = 0;
for (i = 1; i <= n; i++):
foreach q in vertices:
OPT[q][i] = inf;
foreach (p,q) in edges:
OPT[q][i] = min(OPT[q][i], OPT[p][i-1] + w[p][q]);
return OPT[v][n];
请注意,如果不允许重复,则问题是哈密顿路径问题的推广,即NP-Hard。
答案 1 :(得分:0)
这可以通过动态编程来完成。我们首先解决每个节点的“n-1”问题,从节点“u”开始,出口边缘为“v”,然后解为min(sum(sol(u,r),weight(r,v)))
该算法为O(n | vertices |)。