1. 程式人生 > >Dijkstra演算法--一個點到其餘點最短路徑

Dijkstra演算法--一個點到其餘點最短路徑

Dijkstra演算法

要求

求一個點(源點)到其餘各個頂點的最短路徑。

思路

先將源點到其餘各個點的路徑列出來dis[],找到最小值,這個最小值就是源點到這一點u的最短路徑,並標記已經找出,再以這個點開始,依次遍歷到其它點v,如果這個點u到其它點v的距離加上源點到這個點距離(也就是剛剛找出的最短距離)還小於源點直接到點v的距離dis[v],更新陣列dis[v],再在dis[]找出最小值並標記,此時又求出一個點,重複步驟,n-1次後全部求出。

程式碼

#include <stdio.h>

#define N 7
#define M 7

#define X 99999999
int a[N][M] = { { 0, 0, 0, 0, 0, 0, 0}, { 0, 0, 1, 12, X, X, X}, { 0, X, 0, 9, 3, X, X}, { 0, X, X, 0, X, 5, X}, { 0, X, X, 4, 0, 13, 15}, { 0, X, X, X, X, 0, 4}, { 0
, X, X, X, X, X, 0} }; int dis[M] = {0}; int book[M] = {0}; void print_a() { for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { printf("%8d ", a[i][j]); } printf("\n"); } printf("\n"); } void printf_array(int
*p) { for (int i = 0; i < M; ++i) { printf("%8d ", p[i]); } printf("\n"); } int main() { int min; int u; for (int i = 1; i < M; ++i) { dis[i] = a[1][i]; } book[1] = 1; printf_array(dis); for (int i = 1; i < M-1; ++i) { min = X; for (int i = 1; i < M; ++i) { if (book[i] == 0 && dis[i] < min) { min = dis[i]; u = i; } } book[u] = 1; // 標記找到最短距離的點 for (int v = 1; v < M; ++v) { if (a[u][v] < X) { if (a[u][v] + dis[u] < dis[v]) { dis[v] = a[u][v] + dis[u]; } } } printf_array(dis); } return 0; }

時間複雜度

O(N^2)