C语言用DFS实现找到图的所有路径(邻接矩阵实现)
链接:这里详细介绍了DFS遍历的过程,我主要是介绍实现
以下是例子,所有图的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("起点为故障点,请输入一个不为故障点的起点 "); 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 ", 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; }