網路上隨便找都有一堆...
改依下陣列就可以了
- // 最短路徑問題
- // 戴克斯特拉法 (Dijkstra Algorithm)
- #include <stdio.h>
- #define N 8 // 節點數量
- #define M 9999 // 無窮遠
- int a[N+1][N+1] = {{0,0,0,0,0,0,0,0,0},
- {0,0,1,7,2,M,M,M,M},
- {0,1,0,M,M,2,4,M,M},
- {0,7,M,0,M,M,2,3,M},
- {0,2,M,M,0,M,M,5,M},
- {0,M,2,M,M,0,1,M,M},
- {0,M,4,2,M,1,0,M,6},
- {0,M,M,3,5,M,M,0,2},
- {0,M,M,M,M,M,6,2,0}};
- int main(void)
- {
- int j, k, p, start, min,
- leng[N+1], // 至節點的距離
- v[N+1]; // 確定旗標
-
- scanf("%d", &start); // 輸入起點
- for(k = 1; k <= N; k++)
- {
- leng[k] = M;
- v[k] = 0;
- }
-
- leng[start] = 0; // 起點至起點之距離 = 0
-
- for(j = 1; j <= N; j++)
- {
- min = M; // min 初始值
- for(k = 1; k <= N; k++)
- {
- if((v[k] == 0)&&(leng[k] < min))
- { // 最短距離
- p = k;
- min = leng[k];
- }
- }
-
- v[p] = 1;
-
- if(min == M) // 圖形沒有連接
- return 1;
-
- // 若經由 p 至 k 的距離比當時的最短距離小,便會執行更新作業
- for(k = 1; k <= N; k++)
- if((leng[p]+a[p][k]) < leng[k])
- leng[k] = leng[p]+a[p][k];
- }
-
- for(j = 1; j <= N; j++)
- p rintf("%d -> %d : %d\n", start, j, leng[j]);
-
- system( "PAUSE" );
- }
複製代碼 ... |