【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
应用一
设计算法以求解无向图G的连通分量的个数
图示:
深度遍历基本算法dfs(v0)如下 :
void dfs(int v0) { visite(v0); visited[v0]=TRUE;w=firstadj(G,v0);while(w!=0) {if(!visited[w]) dfs(w);w=nextadj(G,v0,w);}}
firstadj(G,v) :返回v的第一个邻接点(号),或0(不存在时)。nextadj(G,v,w);返回v的第w邻接点中处于邻接点w之后的邻接点号, 或0(不存在时)
对整个图的遍历算法如下:
void travel_dfs(graph G)
{for (i=1; i<=n; i++) visited[i]=FALSE;for (i=1; i<=n; i++)if(!visited[i]) dfs(i);}
对无向图G来说,选择某一顶点v执行dfs(v),可访问到所在连通分量中的所有顶点因此,选择起点的次数就是图G的连通分量数, 这可通过修改遍历整个图的算法dfs_travel来实现:每调用一次dfs算法计数一次。另外,考虑到要求求解连通分量数,因而可以将算法设计为整型函数。
具体算法如下
int numofGC(graph G)
{ int i; int k=0; // k用于连通分量的计数for (i=1; i<=n; i++)visited[i]=FALSE; for (i=1; i<=n; i++)if (visited[i]==FALSE){ k++; dfs(G,i); } //用k来累计连通分量个数return k ;
}
2 设计算法求出无向图G的边数
void dfs (graph G, int v )
{ int w;visited[v]=TRUE; //设置访问标志(访问结点的其它操作被省去)w=firstadj(G,v);while (w!=0){ E++; //此处意味着找到一条边,故累计到变量E中if (visited[w]==FALSE)dfs(G,w);w=nextadj(G,v,w);}
}int Enum (graph G )
{ int i; E=0; //全局变量E记录整个图中的边数for (i=1; i<=n; i++) visited[i]=FALSE; for (i=1; i<=n; i++)if (visited[i]==FALSE;) dfs(G,i);return E/2;//注意,因为是无向图,每一条边统计了两次,返回E/2
}
与上面最初的dfs相比多了一个用于统计的E
深度遍历算法的应用二
设计算法,将1–n(=20,或其他数)放在一个环上,使环上任意两个相邻元素的和为质数。
分析:可以用图来描述该问题:
① 用顶点表示一个数
② 若两个数的和为质数,
则对应顶点之间有一条边。 例如,若n=10,对应图如右所示。
在这一表示下,问题转化为:求图中包含所有顶点的简单回路。
如图所示的一个解。
(1,2,3,4,7,6,5,8,9,10)
算法设计中需要注意的: 通过在dfs算法的基础上变化而得:
(1)路径的记录:需要增加变量或参数以记录路径,因此,不妨设一个数组以记录路径中的顶点序列和一个记录长度的变量。
(2)若某些走法行不通,需要重来,为此,要恢复visited[i]标志。
(3)需要判断首尾相接
void getcc(int k)// A,B,visited为全局变量,k初值为1,B[1]固定为1 { int i;if (k==n && A[B[n],B[1]]==1) // 所有顶点在路径上,且构成回路,输出print(B); else if (k<n && k>0) for (i=1;i<=n; i++)if (visited[i]==FALSE && A[B[k],i]==1) // 搜索与B[k]相邻的下一个数i{ visited[i]=TRUE; B[k+1]=i; // 将i放入路径中getcc(k+1); // 往后搜索visited[i]=FALSE; // 取消顶点i的放置,以便可被重新放入 }}
【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数相关推荐
- 数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法
目录 算法描述 算法预期效果 重难点 思路 个人解法 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An, ...
- 算法6.6 采用邻接表表示图的深度优先搜索遍历
算法6.6 采用邻接表表示图的深度优先搜索遍历 代码实现 #pragma once #include <iostream>using namespace std;//图的邻接表存储表示 # ...
- 【搜索算法】深度优先搜索遍历
深度优先,顾名思义是向纵深处遍历树或图,如下图所示: 遍历顺序为1–3–6–9–13–12–5–2–4–8–11–7–10 每次都看向树的右子树,当右子树全部看完后再回到树根向左看(回溯),因此采用堆 ...
- 图的深度优先搜索遍历
深度优先搜索遍历 深度优先搜索遍历类似与树的先序遍历,过程如下 (1) 从图中的某个顶点v出发,访问v (2) 找出刚访问过的顶点的第一个未被访问的邻接点,访问该节点.以该节点为新顶点,重复此步骤,直 ...
- 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历
图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下 ...
- (算法)深度优先搜索
深度优先搜索 概述 [一条路走到底,不撞南墙不回头] [撞南墙]有两种情况:①遇到了边界条件,②遇到了已经走过的路 深度优先的另一种结束条件,就是找到了目标出口 深度优先遍历的本质就是穷举 常见的深度 ...
- 啊哈 , 算法 !--深度优先搜索( C语言版 )
深度优先搜索 : 理解的关键在于解决"当下该如何做".至于"下一步该如何做"则与"当下该如何做"是一样的 问题 : 求出123的全排列 12 ...
- 基础算法·深度优先搜索
祝食用愉快XD 题目链接 (是一道胡乱出的题) U56815 来走迷宫鸭! 解题思路 深度优先搜索,如果能不碰墙地到达右下角的出口,就把旗子立起来表示找到了出口. 什么?你没听过深度优先搜索 没事,且 ...
- 深度优先搜索遍历与广度优先搜索遍历
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 深度优先 ...
最新文章
- 3.放弃CHAR吧,在铸成大错之前!
- 学了redis我能拿你做什么
- Docker-Compose简介与Ubuntu Server 上安装Compose
- Socket程序中的Error#10054错误
- Mybatis中连接池介绍
- [js] 写一个方法遍历指定对象的所有属性
- JAVA并发编程3_线程同步之synchronized关键字
- 世上最简单的mysql_mysql这样学最简单|基本操作上
- ‘ascii‘ codec can‘t encode characters in position
- EasyImage图床源码V2.0
- 源代码src修改为本地图片_20 行 Python 代码批量抓取免费高清图片!
- memcached php封装类,PHP Memcached + APC + 文件缓存封装_PHP - key
- Ubuntu 主题美化
- EasyAR WebAR 开发微信小程序记录
- matlab小游戏程序代码,[转载]Matlab有趣代码
- 网站怎么添加ico小图标
- Java Swing 如何设置图片大小
- torch.optim.Adam优化
- 《高等数学》 总结 导数、微分、不定积分
- 好好说话之Tcache Attack(2):tcache dup与tcache house of spirit
热门文章
- pdf 中的java运行,java - 从pdf文件读取特定位置的itext在intellij中运行,并提供所需的输出,但是可执行jar抛出错误 - 堆栈内存溢出...
- php errorcode,php中pdo错误处理方法详解
- 【mathematical statistics】4 hypothesis testing
- 魅族android6.0,【魅族魅蓝5s评测】迷人Flyme 安卓6.0提升流畅度_手机评测-中关村在线...
- iview table 自定义列_案例 | iview中Table:拖拽适配列、自定义固定列、合并行
- java异常大全,如何处理异常,如何自定义异常
- linux串口传文件除了rz,使用sz/rz基于串口传输文件
- 宝塔执行sh文件_宝塔面板未授权访问
- 中国女足绝地大逆转,爬取了微博评论区,评论很精彩
- 【机器学习算法专题(蓄力计划)】十一、特征数据预处理