簡體   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