博客
关于我
DFS深度优先搜索遍历
阅读量:237 次
发布时间:2019-03-01

本文共 1166 字,大约阅读时间需要 3 分钟。

深度优先搜索(DFS,Depth First Search)是一种常见的图和树遍历算法,早在19世纪就被用于解决迷宫问题。DFS通过使用栈来实现,而与广度优先搜索(BFS)相比,主要区别在于换用了栈数据结构。栈具有后进先出的特性(Last In First Out,LIFO),这使得DFS在探索图时,会优先深入一条路径再回溯。

DFS的基本实现步骤如下:

  • 将起始点放入栈中,并标记为已访问。
  • 重复以下步骤,直到栈为空:
    • 从栈顶取出当前节点。
    • 访问该节点。
    • 找到该节点的所有未访问的邻接点,将这些点按预定规则(如按编号升序)排列后,一起压入栈中。
    • 如果当前节点没有未访问的邻接点,则将其从栈中弹出。
  • 以一棵示例树为例(假设左分枝优先):

  • 将根节点1放入栈中。
  • 取出1,标记为已访问。
    • 1的邻接点为2和9,按规则选择2。
    • 将2放入栈。
  • 取出2,标记为已访问。
    • 2的邻接点为1、3、5。1已访问,排除。选择3。
    • 将3放入栈。
  • 取出3,标记为已访问。
    • 3的邻接点为2和4。2已访问,排除。选择4。
    • 将4放入栈。
  • 取出4,标记为已访问。
    • 4的邻接点为3、5、6。3已访问,排除。选择5。
    • 将5放入栈。
  • 取出5,标记为已访问。
    • 5的邻接点为2、4,均已访问。无未访问节点,弹出5。
  • 取出4,标记为已访问。
    • 4的邻接点为6。
    • 将6放入栈。
  • 取出6,标记为已访问。
    • 6的邻接点为4、7、8。4已访问,排除。选择7。
    • 将7放入栈。
  • 取出7,标记为已访问。
    • 7的邻接点为6,已访问。无未访问节点,弹出7。
  • 取出6,标记为已访问。
    • 6的邻接点为8。
    • 将8放入栈。
  • 取出8,标记为已访问。
    • 8的邻接点为1、6、9。1、6已访问,排除。选择9。
    • 将9放入栈。
  • 取出9,标记为已访问。
    • 9的邻接点无未访问节点,弹出9。
  • 栈中剩余节点依次为8、6、4、3、2、1,即将被弹出,DFS遍历完成。
  • DFS的递归实现方式如下:

    int visited[maxSize];void DFS(AGraph *G, int V) {    visited[V] = 1; // 标记为已访问    printf("%d", V); // 输出访问节点    ArcNode *p = G->adjlist[V].firstarc;    while (p != null) {        if (visited[p->adjvex] == 0) { // 如果邻接点未访问            DFS(G, p->adjvex); // 递归访问        }        p = p->nextarc; // 指向下一条边    }}

    通过这个过程,可以清晰地看到DFS如何深入探索每一条路径,再回溯处理。这种方法确保了在有限的资源下,能够高效地遍历图结构。

    转载地址:http://krzt.baihongyu.com/

    你可能感兴趣的文章
    P1364 医院设置
    查看>>
    P1614 爱与愁的心痛
    查看>>
    spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
    查看>>
    P1865 A % B Problem
    查看>>
    P1908 逆序对
    查看>>
    P2158 [SDOI2008]仪仗队
    查看>>
    P2161 [SHOI2009]Booking 会场预约
    查看>>
    P2260 [清华集训2012]模积和
    查看>>
    P3203 [HNOI2010]弹飞绵羊 —— 懒标记?分块?
    查看>>
    P3240 [HNOI2015]实验比较 树形DP
    查看>>
    P3383 素数筛
    查看>>
    P3455 [POI2007]ZAP-Queries
    查看>>
    P3950部落冲突
    查看>>
    P4 Tutorials Flowlet Switching
    查看>>
    P4313 文理分科
    查看>>
    P4491 [HAOI2018] 染色
    查看>>
    SpringBoot中集成LiteFlow(轻量、快速、稳定可编排的组件式规则引擎)实现复杂业务解耦、动态编排、高可扩展
    查看>>
    P5-js python中的map()函数
    查看>>
    SpringBoot中集成influxdb-java实现连接并操作Windows上安装配置的influxDB(时序数据库)
    查看>>
    P8738 [蓝桥杯 2020 国 C] 天干地支
    查看>>