在有向加权图中寻找最短的顶点序列

时间:2015-04-11 11:36:52

标签: algorithm graph graph-theory

假设我有顶点uv以及一些数字n

如何计算每两个顶点之间有一条边的最短顶点序列的长度(边的权重之和)?

例如:

(u, e_1, u_2, e_2, ..., e_n, v)

序列以顶点u开头,以顶点v结尾,并且边缘为n

2 个答案:

答案 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 |)。