[英]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.