首页 > 其他分享 >深度优先遍历图--DFS

深度优先遍历图--DFS

时间:2024-08-04 18:23:50浏览次数:11  
标签:连通 遍历 -- 优先 DFS 访问 邻接 顶点

一. 前言

        图的遍历定义:从已经给出的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。

        图的遍历实质:找每个顶点的邻接点的过程。

在找顶点邻接点的过程中,可能会出现重复访问某个邻接点的情况,因此为了避免重复访问,我们需要设置一个辅助数组visited[n],用来标记每个被访问过的顶点,数组中所有顶点的初始值都为0;如果该顶点被访问了,那么它在对应数组中的值就变为1,告诉我们它已经被访问过了。

图的遍历总共有两种,一种就是深度优先遍历(DFS),另外一种则是广度优先遍历(BFS),这个我们下篇博客上再讲,这里我们主要学习深度优先遍历。

二. 深度优先遍历的原理及操作

        1)首先在一个图中选择一个起始顶点,然后访问这个起始顶点,修改它在辅助数组中的值,表示它已经被访问过了。

        2)接着访问这个起始顶点的任意一个邻接点v1,再修改它在辅助数组中的值,继续访问与v1邻接但还没有被访问过的顶点v2。

        3)然后再从v2出发,进行类似的访问。

        4)一直重复上面的操作,直至到达一个所有邻接点都被访问的顶点u为止。

        5)然后,退回一步,退到前一次刚访问的顶点,看是否还有其它没有被访问的邻接顶点。如果有,就访问这个顶点,然后继续从这个顶点出发,重复与之前类似的访问。如果没有,就继续退回。

重复上面过程,直到连通图中所有顶点都被访问过为止。

这里说的是连通图,如果是非连通图,也很简单,对它的每个连通分量进行上面的操作就可以了。

深度优先遍历有一种一条道路走到黑的意蕴,只要前面有没有被访问过的邻接点,就一直访问下去,直到找不到没有被访问过的邻接点才退回一步,看上一个顶点是否还有没有被访问过的邻接点。

三. 深度优先遍历算法的代码实现

void DFS(AMGraph G,int v){    //图G的类型就为邻接矩阵的类型,在我之前的文章中有
    cout<<v;    //访问这个顶点
    visited[v]=1;   //修改辅助数组里面的值
    for(int i=0;i<G.vexnum;i++){    //查看邻接矩阵中与该顶点相邻接的顶点中是否有没有被访问过
        if((G.arcs[v][i]!=0)&&(!visited[w]))
        DFS(G,i);    //如果有,就对它也进行这样类似的操作,也就是DFS遍历
}

四. 补充非连通图的深度优先遍历

        如下所示,当一个连通分量访问完,在另外一个连通分量中继续选一个顶点作为起始顶点,继续深度优先遍历。

标签:连通,遍历,--,优先,DFS,访问,邻接,顶点
From: https://blog.csdn.net/2303_78660417/article/details/140907312

相关文章

  • eclipse制作绿色版的配置步骤
    内容包括:一、eclipse工作空间配置二、maven配置三、tomcat配置四、mysql配置五、一键启动文件制作制作完成后,解压即可运行:运行步骤1、启动数据库运行步骤2、启动tomcat运行步骤3、访问项目开始整合:1.工作空间配置在eclipse目录下创建workspace文件夹,作为默认的工......
  • Lyndon Word 小记
    1.定义一个字符串\(S\)被定义为LyndonWord当且仅当其严格小于所有真cyclicshift。LyndonWord的等价定义:是其所有后缀中最小的。2.性质性质1:LyndonWord无\(\text{Border}\)。不妨设\(w\)有\(\text{Border}\),则我们可以表示为\(w=xu=uy\),从而得到\(w......
  • mysql常用的查询
    mysql常用的查询建表末尾必加上ENGINE=InnoDBDEFAULTCHARSET=utf8跨表一列比较,多列查询SELECTsno,cno,rankfromscoreJOINgradeonscore.degree>low&&score.degree<upp;模糊查询,字符转化的筛选查询,分组统计查询SELECTcnofromscoreWHERECAST(cnoASchar)L......
  • 如何搭建云电脑?让数据更安全。。。。。。
    上周,微软Windows系统的蓝屏故障对各行各业造成了严重影响。航空业首当其冲,当天所有航班停飞,人员滞留在机场。酒店业也未能幸免,同样受到波及。1.故障分析及解决措施本次蓝屏事件的导火索是CrowdStrike公司更新的驱动程序。CrowdStrike提供的解决方案相当复杂,用户需......
  • Qt串口助手滑块与STM32进行通信,控制步进电机正反转以及转动固定距离
    一、Qt滑块发送端1、简介QT中滑动条的控件叫QSlider,继承自QAbstractSlider类。主要用途是通过滑块的滑动的方式在一定范围内调节某个值。根据调节的后得到的结果去执行一些处理,比如将值写入或者用这个值进行计算,或者进行值传输等等。 通常使用这个控件是希望我们调节滑块......
  • python-查找元素3(赛氪OJ)
    [题目描述]有n个不同的数,从小到大排成一列。现在告诉你其中的一个数x,x不一定是原先数列中的数。你需要输出最后一个<=x的数在此数组中的下标。输入:输入共两行第一行为两个整数n、x。第二行为n个整数,代表a[i]。输出:请你输出最后一个<=x的数在此数组中的下标。样例输入1541......
  • Educational Codeforces Round 168 (Rated for Div. 2)-7.30复盘
    A.StrongPassword简单题,找到相同的两个相邻字母之间插一个跟他们不同的大写字母即可inlinevoidsolve(){ cin>>s; intid=0; charhh=''; for(inti=1;i<s.size();i++){ if(s[i-1]==s[i]){ id=i;break; } } for(inti=0;i<26;i++){ if(s[id]!='a'+i&a......
  • C语言学习----常用函数
    1.输入输出:scanf输入printf输出格式:scanf("格式控制符",变量的地址);printf(“格式控制符”,变量);注意变量的地址和变量不同,变量的地址用取址符&加变量名组成例如&a;inta;scanf("%d",&a);printf("%d",a);这段代码会要求从控制台输入一个整数,然后输出它。格式控制......
  • WebGL拖动控制点绘制贝塞尔曲线——以三次贝塞尔曲线为例
    为了实现该功能,这里将功能分成两部分。第一部分是控制点的拖动功能,第二部分是贝塞尔曲线的绘制功能。控制点的拖动功能:鼠标按下选择点->鼠标移动修改点->鼠标松开释放点。选择点通过发生mousedown事件后遍历控制点数组,判断点击的位置是否和某个点的距离小于一定值,选择第一个满......
  • 一张图带你了解Linux 文件目录结构,很详细!
    Linux文件目录结构是任何Linux系统的基本组成部分。它为系统提供了一个标准化的文件和目录组织方式,使得用户和应用程序能够以一致的方式访问和管理文件。与Windows系统不同,Linux的文件系统采用单一的树形结构,从根目录(/)开始,所有文件和目录都在其下。理解这一结构不仅对......