迪科斯徹演算法

2021-06-20 02:30:15 字數 1540 閱讀 3445

這個演算法是通過為每個頂點 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,就是奇數了。構造乙個等差數列,等...