[英]Finding shortest sequence of vertices in directed weighted graph
假设我有u
和v
个顶点,还有一些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.