演算法之多源路徑最短

2021-10-13 02:33:12 字數 1687 閱讀 1832

動態規劃演算法

求帶權有向圖的最短連線路徑,即d【i,j】i 結點到 j 結點路徑最短,k是這條路徑上的結點,

那麼必然有d【i,j】=d【i,k】+d【k,j】。如此即表明該問題具備最優子結構,

什麼意思呢,就是d【i,j】=d【i,k】+d【k,j】這個公式中的 i ,j 可以是a十個結點中最大和最小兩個節點,也可以是該圖的十個結點中的中間任意兩項

既然存在最優子結構,可以考慮動態規劃演算法

獲得d【i,j】的最短路徑呢,只有兩種情況

其一:i 可達 j 那麼距離就是 i 到 j 的距離

其二:i 不可達 j ,但是通過結點 k 可達 j

我們不妨借助**

我們將所有兩點之間的距離在最開始都設為不可達,至於為什麼自己到自己的距離設為0我們最後做乙個解釋

如此初始化就已經全部完成

而後就是將邊長的起始節點和末尾節點及長度輸入即可,這裡就不做贅述

最後是最重要的三重迴圈我做乙個詳細解釋

不是說最後只有乙個三重迴圈麼?為什麼還多乙個二重迴圈

其實將二重迴圈放在初始化我覺得也沒什麼問題,但是,這個二重迴圈究其本質是從這個三重迴圈剝離出來的,所以我將其放在了這裡

剛才我說過,獲得最短路徑的方式只有兩個,要麼直接可達,要麼借助其他結點

可究竟借助那個結點呢,我們其實也沒有太好的辦法,就是做乙個窮舉,我每乙個都試一試。

z就是表示借助點,我 i 到 j 的迴圈不難看出是任意乙個結點到任意乙個結點,而這個陣列就是記錄任意兩點之間的距離

首先z等於1的時候就是 i 到 j 的距離借助1是否距離變短,若i 不可達 j 借助 1可達了,那麼我們就將距離值進行更改,使之成為最小距離,並表示 i 到 j 可達。

z的迴圈就是表示我分別用每乙個結點做一次借助點,我試試誰的距離最短。

z的每一次自增,前面借助z可達的路徑我們都可以視為直接可達,所以z-1的出現就是表示這裡的 i 到 j 是直接可達,也就是我們前面說的最短路徑**的第乙個情況

這裡也說明了為什麼我會將z等於0單獨剝離出來,為了防止陣列越界。

那麼path陣列又是用來幹什麼的呢,主要是用來記錄路徑中間結點,在我的運算中這裡記錄的是 i 結點到 j 結點路徑之間最靠近 j 結點的結點

其實以上**就已經將任意兩個結點的最短路徑值算出來了,輸出d【n-1】【n】【n】即可

但是既然留了path,我們可以通過回溯,找出最短路徑到底是那幾個結點

此處**較為簡單,各位看官請自取嗷

void

ppath

(int path[

100]

,int i,

int j)

voidpr(

int path[

100]

,int d[

100]

[100][

100]

,int n)

else}}

}

行文至此,本題也就解決,感謝品讀,你我共同進步!!!

單源最短路徑演算法

簡單介紹 最短路徑演算法是圖演算法中的經典演算法,是用於解決圖中某個頂點到另外乙個頂點所經過路徑的花銷最小 這裡的花銷可能是時間也可能指費用等 dijkstra是用於解決單源最短路徑的經典演算法。圖的儲存方式 鄰接矩陣 在鄰接矩陣中,要獲取某個結點的出度和入讀,是通過掃瞄結點所在臨界矩陣中的行列完成...

Dijstra演算法 單源最短路徑演算法

用dis陣列記錄起點到其餘所有點的最短路徑 include iostream include cstdio define inf 99999999 using namespace std int map 100 100 int dis 100 int book 100 book陣列記錄那些點已經被利...

單源最短路徑演算法 Dijkstra演算法

單源最短路徑演算法 dijkstra演算法 標籤 空格分隔 演算法 這是乙個貪心演算法,每次新擴充套件乙個路程最短的點,更新與其相鄰的點的路程。這個演算法可以解決單源最短路徑問題,這裡是從第乙個點開始到其他點的最短路徑。不能有負權邊,因為擴充套件到負權邊的時候會產生更短的路程,有可能就破壞了已經更新...