時間複雜度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#includeview code#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;
}
時間複雜度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方法一:判斷點的入隊次數,若某點入隊次數超過n次則存在負環。spfa()} }
}
方法二:從起點到該點的最短路中的點數大於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 檔...