來源自我的部落格
http://www.yingzinanfei.com/2017/04/07/dijkstrasuanfaqiudanyuanzuiduanlujing/
#include <stdio.h>#include <limits.h>int main(){ int n, m; scanf("%d%d", &n, &m); int e[10][10]; // 初始化邊 for (int i = 1; i <= n; i++){ for (int j = 1; j <= m; j++){ if (i == j) e[i][j] = 0; else e[i][j] = INT_MAX; } } int t1, t2, t3; // 輸入邊 for (int i = 1; i <= m; i++){ scanf("%d%d%d", &t1, &t2, &t3); e[t1][t2] = t3; } int dis[10]; // 源點到任意點的距離 for (int i = 1; i <= n; i++){ dis[i] = e[1][i]; } int book[10]; // 1表示已處理 for (int i = 1; i <= n; i++){ book[i] = 0; } book[1] = 1; // 核心語句,需要處理n-1個點,迴圈n-1次 for (int i = 1; i <= n - 1; i++){ // 找當前未處理點中離源點最近的點 int min = INT_MAX, u; for (int j = 1; j <= n; j++){ if (book[j] == 0 && dis[j] < min){ min = dis[j]; u = j; } } book[u] = 1; // 將此最近的點標記為已處理 // 更新此點相鄰的點到源點的距離 for (int v = 1; v <= n; v++){ if (e[u][v] < INT_MAX){ // 要直接相鄰 if (dis[v] > dis[u] + e[u][v]){ dis[v] = dis[u] + e[u][v]; } } } } // 可以得到結果了 for (int i = 1; i <= n; i++){ printf("%d ", dis[i]); } return 0;}