数据结构与算法--图的深度优先搜索 (DFS)

article/2025/9/11 12:11:51

        深度优先搜索即是 从起点出发,从规定的方向中选择一个不断往前走,走到头为止,然后尝试另一种方向直到最后的终点。

DFS解决的是连通性问题,即从A是否能到达B。 采用DFS进行遍历的话,必须依赖栈,后进先出。 

        

假设有一个图,里面有ABCDEFGH 8 个顶点,对这个图进行深度优先的遍历

第一步 选择一个起始顶点,例如从顶点 A 开始。把 A 压入栈,标记它为访问过(用红色标记),并输出到结果中。

 

第二步 寻找与 A 相连并且还没有被访问过的顶点,顶点 A BDG 相连,而且它们都还没有被访问过,我们按照字母顺序处理,所以将 B 压入栈,标记它为访问过,并输出到结果中。

 

第三步 现在我们在顶点 B 上,重复上面的操作,由于 B AEF 相连,如果按照字母顺序处理的话,A 应该是要被访问的,但是 A 已经被访问了,所以我们访问顶点 E,将 E 压入栈,标记它为访问过,并输出到结果中。

 

第四步 E 开始, E B G 相连,但是 B 刚刚被访问过了,所以下一个被访问的将是 G ,把 G 压入栈,标记它为访问过,并输出到结果中。

第五步 现在我们在顶点 G 的位置,由于与 G 相连的顶点都被访问过,所以我们这里要做的就是将 G 从栈里弹出,表示我们从 G 这里已经无法继续走下去了,看看能不能从前一个路口找到出路。
如果发现周围的顶点都被访问了,就把当前的顶点弹出。
第六步 现在栈的顶部记录的是顶点 E ,我们来看看与 E 相连的顶点中有没有还没被访问到的,发现它们都被访问了,所以把 E 也弹出去

第七步 当前栈的顶点是 B ,看看它周围有没有还没被访问的顶点,有,是顶点 F ,于是把 F 压入栈,标记它为访问过,并输出到结果中。

第八步  当前顶点是 F ,与 F 相连并且还未被访问到的点是 C D ,按照字母顺序来,下一个被访问的点是 C ,将 C 压入栈,标记为访问过,输出到结果中。

第九步 当前顶点为 C ,与 C 相连并尚未被访问到的顶点是 H ,将 H 压入栈,标记为访问过,输出到结果中。

第十步 当前顶点是 H,由于和它相连的点都被访问过了,将它弹出栈。

第十一步 当前顶点是 C ,与 C 相连的点都被访问过了,将 C 弹出栈。

 

第十二步 当前顶点是 F ,与 F 相连的并且尚未访问的点是 D ,将 D 压入栈,输出到结果中,并标记为访问过。

第十三步 当前顶点是 D ,与它相连的点都被访问过了,将它弹出栈。以此类推,顶点 F B A 的邻居都被访问过了,将它们依次弹出栈就好了。最后,当栈里已经没有顶点需要处理了,我们的整个遍历结束。

 

时间复杂度
        
采用邻接表方式实现
访问所有顶点的时间为 O(V) ,而查找所有顶点的邻居一共需要 O(E) 的时间,所以总的时间复杂度是O(V + E)。
采用邻接矩阵方式实现
查找每个顶点的邻居需要 O(V) 的时间,所以查找整个矩阵的时候需要 O(V^2) 的时间

http://chatgpt.dhexx.cn/article/8MZKSU6W.shtml

相关文章

国际经济学——期末复习

这里写自定义目录标题 李嘉图模型相对价格与供给贸易所得相对工资多种、连续产品的拓展其他概念 专用要素模型孤立经济的情况在国际贸易中贸易模式影响 Heckscher-Ohlin模型要点表述 中略新贸易理论垄断竞争模型(1979)CES效用函数规模报酬递增由于不考所以只写重要结论和推导思…

经济学中的李嘉图模型

前言 因为模型里要用到很多数学推导,所以这篇文章用word写成。然后再截图发上来 原文楼主放在百度网盘里了,链接如下: https://pan.baidu.com/s/14sxnllQ44Wu88moH5_NzTw 定义 一个简单的基础模型 引入技术优势 一个极端的假设 悖论 贸易的…

java中Long型和long型的比较大小

一. Long数据的大小的比较 对于Long类型的数据&#xff0c;这个数据是一个对象&#xff0c;所以对象不可以直接通过“>”,“”&#xff0c;“<”的比较&#xff0c;如果要比较两个对象的是否相等的话&#xff0c;我们可以用Long对象的.equals&#xff08;&#xff09;方…

【Java】Long型与String型互转

String转Long Long.valueOf(str)Long.parseLong(str) Long转String String.valueOf(num)Long.toString(num) import java.util.Arrays; import java.util.List;public class Test {public static void main(String[] args) {String str "100";Long one Long.va…

Long型数据精度丢失问题

数据库中有一个bigint类型数据&#xff0c;对应java后台类型为Long型&#xff0c;在某个查询页面中碰到了问题&#xff1a;页面上显示的数据和数据库中的数据不一致。例如数据库中存储的是&#xff1a;1475797674679549851&#xff0c;显示出来却成了1475797674679550000&#…

vue前端处理后台返回的Long型数据精度丢失

vue前端处理后台返回的Long型数据精度丢失 问题描述 开发时后端返回的id为Long型&#xff0c;结果发现俩id怎么会一样呢&#xff1f;如下图是控制台Preview返回的数据 正以为是后端那边数据有误时&#xff0c;我点开Response发现这边的id是正常的… Preview和Response的数据…

C语言中的long型是究竟占4个字节还是8个字节?

今天在复习C语言的时候踩了一个很有意思的坑。 #include <stdio.h>int main() {printf("long int : %d\n", sizeof(long));return 0; }上面是我在IDE中使用的测试代码&#xff0c;执行它我的第一反应是会得到 4 的长度。 但实际的结果如下图所示&#xff1a;…

c java long_C语言中输出long long型数据怎么输出

展开全部 C语言中输出long long型数据使用%lld格式输出的方法: 1、32313133353236313431303231363533e59b9ee7ad9431333366303761 long long 是C99标准对整型类型做的扩展,每个long long类型的变量占8字节,64位。其表示范围为-9223372036854775808~9223372036854775807。 2、…

解决问题:long型数据精度丢失

在数据库中id设置为bigint且自增在java中对应long型数据 而在前台传输过程中键值过长导致精度丢失 原因是JS内置number类型的安全整数是53位&#xff0c;而Long为8个字节64位&#xff0c;会发生精度丢失 解决办法1&#xff1a; 点击设计表查看选项&#xff0c;发现自动递增数字…

浏览器接收Long型数据精度丢失问题的解决方案

问题描述 当我们后端返回前端Long类型的数据时&#xff0c;后三位会变成0&#xff0c;导致精度丢失。 有意思的地方是&#xff0c;postman测试接口时&#xff0c;查看返回值精度并未丢失&#xff0c;是字符串。 解决方案 在需要保留精度的属性上使用JsonSerialize(using To…

long型长整数字在前端页面显示异常及其解决方法

文章目录 1.引子2.解决问题&#xff08;1&#xff09;初试EL表达式取long型数值&#xff08;2&#xff09;再探EL表达式取字符串格式long型数值&#xff08;3&#xff09;最后一试---给EL表达式加引号 3.总结 1.引子 在做项目中&#xff0c;发现了一个诡异的事情&#xff0c;后…

long 型应该加上 l或者L

Long类型定义数字的L或LL后缀 如果数字后面不加L&#xff0c;默认的取值范围是int&#xff08;整型&#xff09; 比如&#xff1a; 给a赋值&#xff1a;long a&#xff1d;2147483648; &#xff08;数字超出int型取值范围&#xff09; 给a赋值&#xff1a;long a&#xff1…

JAVA生成20位LONG型UUID

编者在开发过程中用postman测试接口&#xff0c;发现要求id为必填且不能含有英文字母&#xff0c;问了对面开发人员才知道需要自己生成20位Long型uuid&#xff0c;写法大概如下&#xff0c;在需要生成的部分调用这个类即可。 package nc.bs.task.util;import java.text.Simple…

解决页面js接受Long型损失精度问题

目录 一、场景描述 二、问题分析 三、解决方法 一、场景描述 在下面这个后台管理中&#xff0c;当我们点击禁用后&#xff0c;会向服务器发送一个请求&#xff0c;同时携带这个员工的19位数字的id。 请求方式为PUT 这里的禁用对应employee表中的status字段&#xff0c;1为启…

java long格式化输出_C语言中输出long long型数据怎么输出?

展开全部 C语言中输出long long型数据使用%lld格式输出的e68a843231313335323631343130323136353331333365633838方法&#xff1a; 1、 long long 是C99标准对整型类型做的扩展&#xff0c;每个long long类型的变量占8字节&#xff0c;64位。其表示范围为-9223372036854775808~…

long型数字计算

在进行以亿为单位的数字计算时&#xff0c;int型往往会有溢出的问题&#xff0c;这时我们需要使用long型数字进行计算 public class demo04 {public static void main(String[] args) {//JDK7新特性&#xff0c;数字之间可以用下划线分割int money 10_0000_0000;int years 2…

随机游走模型(RandomWalk Mobility)

随机游走模型由首先由爱因斯坦在1926年以数学方式描述。由于自然界中的许多实体会以不可预知的方式移动&#xff0c;因此随机游走模型用来描述这种不稳定的移动。在这种移动模型中&#xff0c;移动节点随机选择一个方向和速度来从当前位置移动到新的位置。新的速度和方向分别从…

随机游走和趋势指标

简介 掷硬币游戏很久以来就存在了。让我们来玩这个游戏,不过目的在于测试并理解 FOREX 市场中的技术交易机制。我们并不是第一个将硬币拿在手中的人。那些希望更加详细地学习概率论的人可以参考 William Feller 所写的《An Introduction to Probability Theory and Its Appli…

图模型-随机游走算法

文章目录 推荐基本概念PageRankPersonalRankTextRankSimRank 推荐基本概念 其中用户user[A,B,C],物品item[a,b,c,d]&#xff0c;用户和物品有以下的关系 上述便是一个典型的二分图&#xff0c;我们用G(V,E)来表示&#xff0c;其中V为用户user和物品item组成的顶点集即[A,B,C…