最短路徑演算法

2022-06-19 21:24:18 字數 2444 閱讀 4160

時間複雜度o(n2)。

單源最短路徑演算法,邊權非負,

基於貪心思想

演算法描述:

設起點為s,dis[v]表示從s到v的最短路徑,pre[v]為v的前驅節點,用來輸出路徑。

(a)初始化:dis[v]=0x7fffffff;dis[v]=0;pre[s]=0;

(b)for(int i=1;i<=n;i++)

1.在未被訪問過的點中找乙個點u使得dis[u]是最小的。

2.u標記為已確定最短路徑。

3.for與u相連的每個未確定最短路徑的點v

if(dis[u]+w[u][v]

dis[v]=dis[u]+w[u][v];//鬆弛

pre[v]=u;//記錄這條路徑

}模板題:最小花費

code:

#include#include

#include

#define maxn 2010

using

namespace

std;

int n,m,x,y,a,b,peo;//

n m位總人數和可轉賬人對數,x y z a b見題目,peo指現在的這個人

double

minn;

double

dis[maxn],z[maxn][maxn];

bool

f[maxn];

void dijkstra(int

d) f[peo]=true

;

if(peo==b) break

;

for(int j=1;j<=n;j++)

if((!f[j])&&dis[peo]*z[peo][j]>dis[j])

dis[j]=dis[peo]*z[peo][j];

}}int

main()

cin>>a>>b;

dijkstra(a);

printf(

"%.8lf\n

",100.0/dis[b]);

return0;

}

view code

時間複雜度o(ne),其中n是頂點數,e是邊數。

單源最短路徑演算法,能處理存在負邊權的情況,但無法處理存在負權迴路的情況,基於迭代思想

演算法描述:

設s為起點,dis[v]為s到v的最短距離,pre[v]為v的前驅,w[j]為邊j的長度,且j連線u和v。

(a)初始化:dis[v]=0x7fffffff;dis[s]=0;pre[s]=0;

(b)for(int i=1;i<=n-1;i++)

for(int j=1;j<=e;j++)

if(dis[u]+w[j]

dis[v]=dis[u]+w[j];

pre[v]=u;

}時間複雜度o(ke),其中k是乙個較小的常數(所有頂點進隊的頻率次數),e為邊數。注意,在特殊構造的圖上,該演算法很可能退化為o(nm)。

單源最短路徑演算法,能處理存在負邊權的情況,但無法處理存在負權迴路的情況,是佇列優化的bellman—ford

演算法描述:

void

spfa()} }

}

方法一:判斷點的入隊次數,若某點入隊次數超過n次則存在負環。

方法二:從起點到該點的最短路中的點數大於n。

時間複雜度o(n3)。

多源最短路徑演算法,能處理存在負邊權的情況,基於dp思想。

演算法描述:

(a)初始化:點u和v如果有邊相連,則dis[u][v]=w[u][v]。

(b)for(int k=1;k<=n;k++)

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

if((i!=j)&&(k!=j)&&(i!=k)&&(dis[i][k]+dis[k][j]

dis[i][j]=dis[i][k]+dis[k][j];

注意:k一定要放在最外層迴圈!!!很重要!!!

原理:k一次性更新了所有的點對,更新i和j時保證了i-k的距離已經被更新過了,所以f[k][i][j]表示i和j之間可通過前k個節點的最短路徑。

精髓:依次掃瞄每一點(k),並以該點作為中介點,計算出通過k點的其他任意兩點(i,j)的最短距離。

兩種可能:1.經過第k個點不能找到最短路徑,f[k][i][j]=f[k-1][i][j]

2.經過第k個點更找到更短的路徑,f[k][i][j]=f[k-1][i][k]+f[k-1][k][j]

因為f[k]只與f[k-1]有關,所以f最外層一維空間可以省略。

for(int k=1;k<=n;k++)
*參考:《資訊學奧賽一本通》《演算法競賽高階指南》。

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路徑演算法

floyd演算法 012345 001 54 1108 1 2 801 3 3 1035 45 302 5413520 floyd 演算法過程描述如下 首先 以邊集 初始化,得到所有的直接連通代價 依次考慮第 k個結點,對於 中的每乙個 i j 判斷是否滿足 s i j s i k s k j 如果...

最短路徑演算法

個人覺得下面 有代表性 最短路徑演算法原始碼 vb 本人載 開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc info 檔...