C语言用DFS实现找到图的所有路径(邻接矩阵实现)
链接:https://blog.csdn.net/hackersuye/article/details/79044555这里详细介绍了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("起点为故障点,请输入一个不为故障点的起点\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;
}
3、结果如下:
C语言用DFS实现找到图的所有路径(邻接矩阵实现)相关推荐
- Last Theorem CodeForces - 1325F(dfs树找最大环+思维)
It's the year 5555. You have a graph, and you want to find a long cycle and a huge independent set, ...
- CodeForces - 1364D Ehabs Last Corollary(dfs树找最小环)
题目链接:点击查看 题目大意:给出一个由 n 个结点和 m 条边构成的无向图,再给出一个 k ,需要在图中完成下面任意一种操作: 找到一个大小恰好为 的独立集 找到一个大小不超过 k 的环 题目分析 ...
- 加域时提示找不到网络路径
加域时提示找不到网络路径: 1.暂时关闭防火墙 2.ping同DC 3.能否解析域名nslookup,客户机DNS首选项为DC地址 net stop dns && net stop n ...
- 生产路由跳转报错找不到js路径问题
问题描述:点击路由跳转报错 解决方案:问题原因是点击路由找不到js路径,修改打包配置为绝对路径,部署到tomcat根目录 转载于:https://www.cnblogs.com/lcosima/p/9 ...
- web服务器获取项目路径问题,读取web项目properties文件路径 解决tomcat服务器找不到properties路径问题...
1.需求:有时候我们产品经理给我们的需求是会不断变化的,例如数量是1000现在变成500,我们不可以去改代码吧,这样很麻烦,所以就可以改配置文件properties(这个数据库链接一样),当然也有js ...
- win7访问linux共享路径不存在,win7系统访问网络共享找不到网络路径如何解决
近日有win7系统用户要访问网络共享文件夹的时候,却遇到了提示找不到网络路径的情况,该怎么办呢,经过分析可能是防火墙没有关闭引起的,下面随小编一起来看看win7系统访问网络共享找不到网络路径的解决方法 ...
- TortoiseSVN Launch Failed Error:系统找不到指定路径
右键操作TortoiseSVN 各种报 Launch Failed Error:系统找不到指定路径 刚刚安装完成后出现的问题 解决方案:重启电脑
- php fopen 找不着文件,fopen 系统找不到指定路径 PHP文件包含详细讲述(4)
test.txt 代码 结果截断失败,改下代码: $webpath = dirname(__FILE__)."/"; $filepath = "test.txt" ...
- mysql properties文件路径_读取web项目properties文件路径 解决tomcat服务器找不到properties路径问题...
1.需求:有时候我们产品经理给我们的需求是会不断变化的,例如数量是1000现在变成500,我们不可以去改代码吧,这样很麻烦,所以就可以改配置文件properties(这个数据库链接一样),当然也有js ...
最新文章
- java.lang.IllegalArgumentException: column ‘_id‘ does not exist
- 用Piranha来实现WEB的负载均衡
- Go get 下载的包在哪里?
- java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...
- 一个弹窗口的流氓软件
- 启明云端分享| 手把手教你基于DEMO源码快速进行86盒应用开发
- Windows 下配置Apache+MySql+PHP环境(原创)
- windows2000 ,windowsXP和windows2003共享页面文件
- oracle date 截取年月,在Oracle中,可用于提取日期时间类型特定部分(如年、月、日、时、分、秒)的函数有那些...
- Hibernate笔记7--JPA CRUD
- WINX的消息分派机制(续)
- Nginx源码包软件安装步骤
- SQL SERVER2005安装
- IDC 监控技术介绍
- 删除本地.svn文件
- CommandNotFoundError: Your shell has not been properly configured to use ‘conda deactivate‘.
- TFT-LCD显示屏工作原理图文解析
- 操作系统-复习-考题预测及解析-期中考试
- 随机数Math.random()公式
- Electron对接语音唤醒Windows SDK