【技术分享】图遍历算法之深度优先遍历算法

共 2166字,需浏览 5分钟

 ·

2023-08-25 23:44


36f6eb6fba470416ef619ba79618bb78.webp


df368a7fe6e18f5005888f6946ca40a1.webp

深度优先遍历算法是经典的图论算法,它的思想是:从一条路径的起始点开始追溯,直到到达路径的最后一个顶点,然后回溯,继续追溯下一条路径,直到到达最后的顶点,如此往复,直到没有路径为止。它的遍历过程如下:



(1)以图中的任一顶点V为起始点,首先访问顶点V,并将其标记为已被访问。


(2)从顶点V的任一个邻接点出发继续进行深度优先搜索,直至图中所有和顶点V连通的顶点都已被访问。


(3)若此时图中仍有未被访问的顶点,则选择一个未被访问的顶点作为新的出发点重复上述过程,直至图中所有顶点都已被访问为止。



深度优先遍历方法应用了堆栈这种数据结构的特点,这里以下图所示的无向图为例来介绍这个方法的遍历过程。


1161aa52fee1cf66f138c8ceab5847a0.webp


步骤 1 :假设以顶点 A 为起点,将顶点 A 压入堆栈,如下图所示。


dd9d375af2232712b2bba2e93dbc018e.webp


步骤 2 :弹出顶点 A ,将顶点 A 的邻接点 B C 压入堆栈,如下图所示。


ca3dd47ef8033d9a79e5644da05b5dd5.webp


步骤 3 :根据堆栈“后进先出”的原则,弹出顶点 C ,再将与顶点 C 相邻并且未被访问过的顶点 B 、顶点 D 和顶点 E 压入堆栈,如下图所示。


b55cecb16809f7396d2c7e179e428cfe.webp


步骤 4 :弹出顶点 E ,将与顶点 E 相邻并且未被访问过的顶点 D 压入堆栈,如下图所示。


30b45d471320cce383f985acf5fc26fa.webp


步骤 5 :弹出顶点 D ,将与顶点 D 相邻并且未被访问过的顶点 B 和顶点 F 压入堆栈,如下图所示。


bd175bc595fee3d3b7a110ba3cc1d751.webp


步骤 6 :弹出顶点 F ,将与顶点 F 相邻并且未被访问过的顶点压入堆栈。由于顶点 F 的邻接点 D 已被访问过,所以无需压入堆栈,如下图所示。


8e45ae6fc064e86af1dc53a9d42e5881.webp


步骤 7 :弹出顶点 B ,将与顶点 B 相邻并且未被访问过的顶点压入堆栈。由于顶点 B 的邻接点都已被访问过,所以无需压入堆栈,如下图所示。


2d69133b72008a6228a2b3f9083bfb46.webp


步骤 8 :将堆栈中的顶点依次弹出,并判断是否已经访问过,直到堆栈中无顶点可以访问为止,如下图所示。


25c674ac49bfb6bb90fcf8036c2dda43.webp


由此可知,对图进行深度优先遍历的顺序为:顶点 A 、顶点 C 、顶点 E 、顶点 D 、顶点 F 、顶点 B


用Python代码描述上述过程,则算法代码如下:


def  dfs (graph, start):


    stack = []  定义堆栈


     stack.append(start) 将起始顶点压入堆栈


     visited =  set () 定义集合


     while  stack:


        vertex = stack.pop() 弹出栈顶元素


         if  vertex  not in  visited 如果该顶点未被访问过


            visited.add(vertex) 将该顶点放入已访问集合


             print (vertex, end  ' ' 打印深度优先遍历的顶点


         for  in  graph[vertex] 遍历相邻的顶点


             if  not in  visited  如果该顶点未被访问过


                stack.append(w)  把顶点压入堆栈








c587effa426bfbb8684e6cdecfb1500b.webp

4cba48219866e40cbdac0fd2936b8751.webp


浏览 137
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报