迪科斯徹演算法總結

2021-07-04 16:01:54 字數 1185 閱讀 1030

迪科斯徹演算法是由荷蘭計算機科學家愛滋郝爾·戴克斯拉提出的。本演算法使用廣度優先搜尋解決非負權有向圖的單源最短路徑問題,演算法最終得到乙個最短路徑樹。此演算法常用於路由演算法或者作為其他圖演算法乙個子模組,本演算法是用來找乙個點到其他所有點之間的最短路徑。

此演算法中變數的使用:

map二維陣列記錄兩點之間的權值,例如map[i][j]存放i點到j點的權值,當作為有向圖時,給出i,j需要存放的只有乙個map,但一般情況下都是用無向圖,需存兩個map,即map[i][j]=map[j][i]=權值。

dis一維陣列存放各點到起點的最短距離,mark一維陣列標記使用過的點。

單源最短路:

ⅰ、從乙個點出發到其他所有點的最短路徑的長度

ⅱ、基本操作:鬆弛操作。

ⅲ、dis[j] > dis[vir] + map[vir][j]這樣的邊(vir,j)成為緊的,可以對它進行鬆弛操作。

對所有點進行鬆弛操作的**可參考:

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

ⅳ、最開始給每乙個點乙個很大的dis值,從dis[s] = 0;開始,不斷給可以鬆弛的點進行鬆弛操作,直至求出所有點的最短路徑。

本演算法要求圖中不存在負權邊。可證明:具有最小的dis[i]的點沒有加入最短路時,此後的點無法鬆弛。所以每次均要尋找最近的點進行鬆弛操作。

#include#define inf 0x3f3f3f3f					//定義乙個較大的值,用來初始化 

int map[1010][1010]; //存放兩點間的權值

int dis[1010]; //存放各點距起點的距離

int mark[1010]; //標記使用過的點

int n,m; //有n個點,編號為1~n,有m組資料

void dijkstra(int s)

dis[s]=0;

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

}int main()

} int start,end;

scanf("%d%d",&start,&end); //輸入起點和終點

dijkstra(start); //呼叫迪科斯徹演算法

printf("%d\n",dis[end]); //輸出起點與終點間最短距離

} return 0;

}

迪科斯徹演算法

這個演算法是通過為每個頂點 v 保留目前為止所找到的從s到v的最短路徑來工作的。初始時,原點 s 的路徑長度值被賦為 0 d s 0 若存在能直接到達的邊 s,m 則把d m 設為w s,m 同時把所有其他 s不能直接到達的 頂點的路徑長度設為無窮大,即表示我們不知道任何通向這些頂點的路徑 對於 v...

尼科徹斯定理

題目描述 驗證尼科徹斯定理,即 任何乙個整數m的立方都可以寫成m個連續奇數之和。例如 1 3 1 2 3 3 5 3 3 7 9 11 4 3 13 15 17 19 介面說明 原型 功能 驗證尼科徹斯定理,即 任何乙個整數m的立方都可以寫成m個連續奇數之和。原型 int getsequeoddnu...

尼科徹斯定理

驗證尼科徹斯定理,即 任何乙個整數的立方都可以寫成一串連續奇數的和。問題分析與演算法設計 本題是乙個定理,我們先來證明它是成立的。對於任一正整數a,不論a是奇數還是偶數,整數 a a a 1 必然為奇數。a a a 1 a 1 xa 1 奇數乘偶數必為偶數,在加上1,就是奇數了。構造乙個等差數列,等...