這個演算法是通過為每個頂點 v 保留目前為止所找到的從s到v的最短路徑來工作的。初始時,原點 s 的路徑長度值被賦為 0 (d[s] = 0),若存在能直接到達的邊(s,m),則把d[m]設為w(s,m),同時把所有其他(s不能直接到達的)頂點的路徑長度設為無窮大,即表示我們不知道任何通向這些頂點的路徑(對於 v 中所有頂點 v 除 s 和上述 m 外 d[v]= ∞)。當演算法退出時,d[v] 中儲存的便是從 s 到 v 的最短路徑,或者如果路徑不存在的話是無窮大。 dijkstra 演算法的基礎操作是邊的拓展:如果存在一條從 u 到 v 的邊,那麼從 s 到 v 的最短路徑可以通過將邊(u, v)新增到尾部來拓展一條從 s 到 u 的路徑。這條路徑的長度是 d[u] + w(u, v)。如果這個值比目前已知的 d[v] 的值要小,我們可以用新值來替代當前 d[v] 中的值。拓展邊的操作一直執行到所有的 d[v] 都代表從 s 到 v 最短路徑的花費。這個演算法經過組織因而當 d[u] 達到它最終的值的時候每條邊(u,v)都只被拓展一次。
演算法維護兩個頂點集 s 和 q。集合 s 保留了我們已知的所有 d[v] 的值已經是最短路徑的值頂點,而集合 q 則保留其他所有頂點。集合s初始狀態為空,而後每一步都有乙個頂點從 q 移動到 s。這個被選擇的頂點是 q 中擁有最小的 d[u] 值的頂點。當乙個頂點 u 從 q 中轉移到了 s 中,演算法對每條外接邊 (u, v) 進行拓展。
迪科斯徹演算法使用了
廣度優先搜尋
解決非負權有向圖的單源
最短路徑問題
,演算法最終得到乙個
最短路徑
樹。演算法實現:
#include
#include
#include
#define max_vex_num 30
#define infinity 30000
#define yes 1
#define no 0
typedef struct graph * g;
struct graph;
void create_graph(g g);
void dij(g g,int d,int p,int v0);
int find_min(g g,int final,int d);
void print_graph(g g,int p);
void main()
void create_graph(g g)
}printf("now, init the graph\n");
int start = 0;
int end = 0;
int weight = 0;
for(i=0;iarcnum;i++)
}void dij(g g,int d,int p,int v0)
final[v] = yes;
int s = 0;
for(s=0;svexnum;s++)}}
}int find_min(g g,int final,int d)
}return v;
}void print_graph(g g,int p)
printf("\n"); }}
迪科斯徹演算法總結
迪科斯徹演算法是由荷蘭計算機科學家愛滋郝爾 戴克斯拉提出的。本演算法使用廣度優先搜尋解決非負權有向圖的單源最短路徑問題,演算法最終得到乙個最短路徑樹。此演算法常用於路由演算法或者作為其他圖演算法乙個子模組,本演算法是用來找乙個點到其他所有點之間的最短路徑。此演算法中變數的使用 map二維陣列記錄兩點...
尼科徹斯定理
題目描述 驗證尼科徹斯定理,即 任何乙個整數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,就是奇數了。構造乙個等差數列,等...