迪科斯徹演算法是由荷蘭計算機科學家愛滋郝爾·戴克斯拉提出的。本演算法使用廣度優先搜尋解決非負權有向圖的單源最短路徑問題,演算法最終得到乙個最短路徑樹。此演算法常用於路由演算法或者作為其他圖演算法乙個子模組,本演算法是用來找乙個點到其他所有點之間的最短路徑。
此演算法中變數的使用:
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,就是奇數了。構造乙個等差數列,等...