C語言用DFS實現找到圖的所有路徑(鄰接矩陣實現)
阿新 • • 發佈:2018-12-18
以下是例子,所有圖的DFS遍歷,只需要修改createGraphics()函式即可,即生成自己的map(鄰接矩陣),就可以找到兩個點之間所有的路徑。
1.問題如下:
輸入一個矩陣的行數r(5-10)與列數c(5-10),生成一個無向圖,該圖每行有c個頂點每列有r個頂點,相鄰頂點間有邊連線,邊的權值均為1,對該圖的頂點進行編號,分別為1,2,...,r*c,用DFS找到某兩個點之間的所有路徑。
及類似如下的圖:(只是簡單的改變行和列)
2.程式碼如下
#include<stdio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> int map[100][100]; int row, column; int i, j; int pathOrder = 0; //記錄到當前找到的路徑個數 int startPoint, endPoint; int path[100], visited[100] = { 0 }; int pathNumber = 0; // //初始化連線矩陣 // void createGraphics() { int tmp[4][2] = { {0,1},{1,0},{-1,0},{0,-1} }; memset(map, 0, sizeof(map)); for (i = 0; i < row*column; i++) { //找到該點上下左右4個點初始map int r = i / column; int c = i % column; for (j = 0; j < 4; j++) { //(r,c)相鄰的點為(r1,c1) int r1 = r + tmp[j][0]; int c1 = c + tmp[j][1]; if (r1 >= 0 && r1 < row&&c1 >= 0 && c1 < column) { map[i][r1*column + c1] = 1; } } } } // //返回第n個節點相連線序號最小的節點 // int first(int n) { for (i = 0; i < row*column; i++) { if (map[n][i] == 1) return i; } printf("起點為故障點,請輸入一個不為故障點的起點\n"); return 0; } // //返回第n個節點相鄰的點的個數 // int sumCount(int n) { int count = 0; for (i = 0; i < row*column; i++) { if (map[n][i] == 1) count++; } return count; } // //返回第n個節點相連的比now節點序號大的節點, // int next(int n, int now) { for (i = now + 1; i < row*column; i++) { if (map[n][i] == 1) return i; } return 1000; //當找不到節點n的下一個節點,返回1000 } // //DFS尋找所有路徑 //count為從起點到當前節點經過的節點數,pathNumber為尋找到的路徑條數 void DFS(int nowPoint, int count) { visited[nowPoint] = 1; path[count++] = nowPoint; if (nowPoint == endPoint && (count) >= 1) { pathNumber++; printf("這兩個城市間第%d條簡單路徑為: ", pathNumber); for (i = 0; i < (count)-1; i++) { printf("%d-->", path[i] + 1); } printf("%d\n", path[(count)-1] + 1); } else { int k; for (k = first(nowPoint); k < row*column; k = next(nowPoint, k)) { if (visited[k] == 0) DFS(k, count); } } visited[nowPoint] = 0; //演算法關鍵,回溯,將訪問過狀態變為未訪問狀態 (count)--; return; } int main() { int count = 0, pathNumber = 0; printf("請輸入要生成圖的行和列:"); scanf("%d%d", &row, &column); createGraphics(); printf("請輸入要找到路徑的起點和終點:"); scanf("%d%d", &startPoint, &endPoint); startPoint--; endPoint--; DFS(startPoint, count); system("pause"); return 0; }