繁体   English   中英

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

[英]Finding shortest sequence of vertices in directed weighted graph

假设我有uv个顶点,还有一些n

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

例如:

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

该序列以顶点u开始,以顶点v结尾,并且具有n边。

由于允许重复,因此可以通过在Bellman-Ford算法中稍作改动来在多项式时间内解决。 令OPT(v,i)表示使用i条边达到v的最佳成本,令w(x,y)表示顶点x和y之间的权重。 然后我们有以下重复发生:

在所有边(u,v)上,OPT(v,i + 1)= min {OPT(u,i)+ w(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。

这可以通过动态编程来完成。 我们首先用从节点“ u”到“ v”的输出边到“ v”的每个节点解决“ n-1”的问题,然后解为min(sum(sol(u,r),weight(r,v)))此算法的O(n | vertices |)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM