城市的地圖如下圖所示

數據是這樣給出的:
5 8
1 2 2
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3
第一行的5表示有5個城市,8表示有8條公路。接下來的8行每行是一條類似“a b c”的數據:表示從城市a到城市b有c公里
已知有5個城市8條路徑,可以用一個5*5的矩陣(二維數組e)來存儲這些信息。
此外還需要一個book數組來記錄哪些城市已經走過,以免出現死循環。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define INF 999999 int book[101], e[101][101]; int n; int min = 9999999; int path[100]; /// 用來保存路徑 void dfs(int cur, int dis) { int i; if (n == cur) //判斷是否到達了目標城市 { for (i = 1; i <= n; i++) /// 輸出所有可能的路徑 { if (path[i]) { printf("%d ", path[i]); //輸出路徑 } } printf("\t\t該路徑對應的長度是:%d\n", dis);//輸出對應路徑長度 if (min > dis) //更新最小路徑 { min = dis; } return; } for (i = 1; i <= n; ++i) //從1號城市到n號城市依次嘗試 { //判斷當前城市cur到城市i是否有路,並判斷城市i是否在已走過的路徑中 if (e[cur][i] != INF && book[i] == 0) { book[i] = 1;//標記城市i已經在路徑中 path[i] = i;//保存路勁到path數組中 dfs(i, dis + e[cur][i]); book[i] = 0; /// 之前一部探索完畢后,取消對城市 i 的標記以便另一條路徑選擇頂點 path[i] = 0; } } } int main(/*int argc, char const *argv[]*/) { int i, j, a, b, c, m; scanf_s("%d %d", &n, &m); //初始化二維矩陣 for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { if (i == j) { e[i][j] = 0; } else { e[i][j] = INF; } } } //讀入城市之間的道路 for (i = 1; i <= m; ++i) { scanf_s("%d %d %d", &a, &b, &c); e[a][b] = c; } book[1] = 1; //標記1號城市已經在路徑中 path[1] = 1; dfs(1, 0);//1表示當前所在城市標號,0表示當前已經走過的路程 printf("最短路徑的長度是:\n"); printf("%d\n", min);//打印最短路徑 system("pause"); return 0; }

上圖對應的是有向圖,如果是無向圖怎么辦呢?
其實,很簡單:只需要在存儲的時候加一句:e[b][a]=c ,並且修改一下for循環的參數防止重復for (i = cur; i <= n; ++i)
直接上代碼和結果:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define INF 999999 int book[101], e[101][101]; int n; int min = 9999999; int path[100]; /// 用來保存路徑 void dfs(int cur, int dis) { int i; if (n == cur) //判斷是否到達了目標城市 { for (i = 1; i <= n; i++) /// 輸出所有可能的路徑 { if (path[i]) { printf("%d ", path[i]); //輸出路徑 } } printf("\t\t該路徑對應的長度是:%d\n", dis);//輸出對應路徑長度 if (min > dis) //更新最小路徑 { min = dis; } return; } for (i = cur; i <= n; ++i) //從1號城市到n號城市依次嘗試 { //判斷當前城市cur到城市i是否有路,並判斷城市i是否在已走過的路徑中 if (e[cur][i] != INF && book[i] == 0) { book[i] = 1;//標記城市i已經在路徑中 path[i] = i;//保存路勁到path數組中 dfs(i, dis + e[cur][i]); book[i] = 0; /// 之前一部探索完畢后,取消對城市 i 的標記以便另一條路徑選擇頂點 path[i] = 0; } } } int main(/*int argc, char const *argv[]*/) { int i, j, a, b, c, m; scanf_s("%d %d", &n, &m); //初始化二維矩陣 for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { if (i == j) { e[i][j] = 0; } else { e[i][j] = INF; } } } //讀入城市之間的道路 for (i = 1; i <= m; ++i) { scanf_s("%d %d %d", &a, &b, &c); e[a][b] = c; e[b][a] = c; } book[1] = 1; //標記1號城市已經在路徑中 path[1] = 1; dfs(1, 0);//1表示當前所在城市標號,0表示當前已經走過的路程 printf("最短路徑的長度是:\n"); printf("%d\n", min);//打印最短路徑 system("pause"); return 0; }

