图的寻路算法详解:基于深度优先搜索(DFS)的实现

作者:Seal^_^日期:2025/11/2

图的寻路算法详解:基于深度优先搜索DFS的实现

    • 一、寻路算法概述
      • DFS寻路示例
    • 二、算法核心思想
      • 数据结构设计
    • 三、算法实现详解
      • 1. 核心数据结构
        • 2. 构造函数初始化
        • 3. DFS实现
        • 4. 路径查询方法
    • 四、完整代码实现
    • 五、算法测试与应用
      • 测试代码
        • 输出结果
    • 六、算法分析与优化
      • 时间复杂度分析
        • 空间复杂度
        • 优化方向
    • 七、DFS寻路与BFS寻路对比
    • 八、实际应用场景
    • 九、总结
🌺The Begin🌺点点关注,收藏不迷路🌺

一、寻路算法概述

图的寻路算法是图论中的基础算法之一,用于找到从一个顶点到另一个顶点的路径。深度优先搜索(DFS)是实现寻路算法的一种有效方法,它沿着图的深度方向尽可能远的搜索路径。

DFS寻路示例

0

1

2

3

4

5

6

从顶点0到顶点6的DFS路径可能是:0 → 1 → 4 → 6

二、算法核心思想

  1. 记录路径:使用from数组记录每个顶点的前驱顶点
  2. 深度优先遍历:从起点开始递归访问所有未访问的邻接顶点
  3. 路径回溯:通过from数组逆向回溯找到完整路径

数据结构设计

Path

-Graph G

-int s

-boolean[] visited

-int[] from

+dfs(int v)

+hasPath(int w)

+path(int w)

+showPath(int w)

三、算法实现详解

1. 核心数据结构

  • visited数组:记录顶点是否被访问过
  • from数组:记录路径中每个顶点的前驱顶点
  • s:起始顶点

2. 构造函数初始化

1public Path(Graph graph, int s) {
2    G = graph;
3    assert s >= 0 && s < G.V();
4    visited = new boolean[G.V()];
5    from = new int[G.V()];
6    for(int i = 0; i < G.V(); i++) {
7        visited[i] = false;
8        from[i] = -1;
9    }
10    this.s = s;
11    dfs(s);
12}
13

3. DFS实现

1private void dfs(int v) {
2    visited[v] = true;
3    for(int i : G.adj(v)) {
4        if(!visited[i]) {
5            from[i] = v;  // 记录前驱顶点
6            dfs(i);
7        }
8    }
9}
10

4. 路径查询方法

1boolean hasPath(int w) {
2    assert w >= 0 && w < G.V();
3    return visited[w];
4}
5
6Vector<Integer> path(int w) {
7    assert hasPath(w);
8    
9    Stack<Integer> s = new Stack<>();
10    int p = w;
11    while(p != -1) {
12        s.push(p);
13        p = from[p];
14    }
15    
16    Vector<Integer> res = new Vector<>();
17    while(!s.empty())
18        res.add(s.pop());
19    
20    return res;
21}
22

四、完整代码实现

1
2import java.util.Stack;
3import java.util.Vector;
4
5/**
6 * 基于DFS的寻路算法
7 */
8public class Path {
9    private Graph G;       // 图的引用
10    private int s;        // 起始点
11    private boolean[] visited;  // 记录访问过的节点
12    private int[] from;   // 记录路径,from[i]表示i的前驱节点
13
14    // 构造函数,寻路算法
15    public Path(Graph graph, int s) {
16        G = graph;
17        assert s >= 0 && s < G.V();
18        
19        visited = new boolean[G.V()];
20        from = new int[G.V()];
21        for(int i = 0; i < G.V(); i++) {
22            visited[i] = false;
23            from[i] = -1;
24        }
25        this.s = s;
26        
27        // 开始DFS寻路
28        dfs(s);
29    }
30
31    // 深度优先遍历
32    private void dfs(int v) {
33        visited[v] = true;
34        for(int i : G.adj(v)) {
35            if(!visited[i]) {
36                from[i] = v;
37                dfs(i);
38            }
39        }
40    }
41
42    // 判断是否有路径
43    boolean hasPath(int w) {
44        assert w >= 0 && w < G.V();
45        return visited[w];
46    }
47
48    // 获取路径
49    Vector<Integer> path(int w) {
50        assert hasPath(w);
51        
52        Stack<Integer> stack = new Stack<>();
53        int p = w;
54        while(p != -1) {
55            stack.push(p);
56            p = from[p];
57        }
58        
59        Vector<Integer> res = new Vector<>();
60        while(!stack.empty())
61            res.add(stack.pop());
62        
63        return res;
64    }
65
66    // 打印路径
67    void showPath(int w) {
68        assert hasPath(w);
69        
70        Vector<Integer> vec = path(w);
71        for(int i = 0; i < vec.size(); i++) {
72            System.out.print(vec.elementAt(i));
73            if(i != vec.size() - 1)
74                System.out.print(" -> ");
75        }
76        System.out.println();
77    }
78}
79

五、算法测试与应用

测试代码

1public class PathTest {
2    public static void main(String[] args) {
3        // 创建一个图
4        Graph g = new SparseGraph(7, false);
5        g.addEdge(0, 1);
6        g.addEdge(0, 2);
7        g.addEdge(1, 3);
8        g.addEdge(1, 4);
9        g.addEdge(2, 5);
10        g.addEdge(4, 6);
11        
12        // 寻路算法测试
13        Path path = new Path(g, 0);
14        
15        System.out.println("Path from 0 to 6:");
16        path.showPath(6);  // 输出:0 -> 1 -> 4 -> 6
17        
18        System.out.println("Path from 0 to 5:");
19        path.showPath(5);  // 输出:0 -> 2 -> 5
20        
21        System.out.println("Has path to 3: " + path.hasPath(3));
22        System.out.println("Has path to 6: " + path.hasPath(6));
23    }
24}
25

输出结果

1Path from 0 to 6:
20 -> 1 -> 4 -> 6
3Path from 0 to 5:
40 -> 2 -> 5
5Has path to 3: true
6Has path to 6: true
7

六、算法分析与优化

时间复杂度分析

操作时间复杂度
初始化O(V)
DFS遍历O(V + E)
路径查询O(L) L为路径长度

空间复杂度

  • O(V) 用于存储visited和from数组

优化方向

  1. 广度优先搜索(BFS):可以找到最短路径
  2. 双向搜索:同时从起点和终点开始搜索
  3. 启发式搜索:如A*算法,适用于有权图

七、DFS寻路与BFS寻路对比

起点

DFS vs BFS

DFS

BFS

使用栈/递归

不一定是最短路径

使用队列

保证最短路径

选择建议

  • 需要找到任意路径时使用DFS
  • 需要找到最短路径时使用BFS
  • 图非常大时DFS内存消耗更少

八、实际应用场景

  1. 迷宫求解
  2. 网络路由
  3. 社交网络中查找关系链
  4. 游戏中的AI路径规划
  5. 依赖关系解析

九、总结

本文详细介绍了基于DFS的图寻路算法,重点讲解了:

  1. 算法核心思想和数据结构设计
  2. 完整的Java实现代码
  3. 算法的时间复杂度和空间复杂度分析
  4. 与BFS寻路的对比
  5. 实际应用场景

DFS寻路算法是图算法的基础,虽然不能保证找到最短路径,但实现简单且在某些场景下效率很高。理解这一算法有助于学习更复杂的图算法如Dijkstra、A*等。

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺

图的寻路算法详解:基于深度优先搜索(DFS)的实现》 是转载文章,点击查看原文


相关推荐


高并发压力测试:Llama-2-7b 在昇腾 NPU 的六大场景表现
2501_938774292025/10/30

以下是关于 Llama-2-7b 在昇腾 NPU 上进行高并发压力测试的六大场景表现分析,结合网络公开信息和技术逻辑整理而成: 场景一:文本生成吞吐量测试 在批量文本生成任务中(如问答、摘要),昇腾 NPU 通过异构计算架构优化模型并行度。实测数据显示,当并发请求数从 100 提升至 1000 时,吞吐量增长约 3.8 倍,但单请求响应时间增加 15%-20%,显存占用峰值达 80%。 关键指标: 吞吐量:1200 tokens/s(batch_size=32)延迟:50ms/toke


Swift 官方发布 Android SDK | 肘子的 Swift 周报 #0108
东坡肘子2025/10/28

📮 想持续关注 Swift 技术前沿? 每周一期《肘子的 Swift 周报》,为你精选本周最值得关注的 Swift、SwiftUI 技术文章、开源项目和社区动态。 📬 在 weekly.fatbobman.com 免费订阅 💬 加入 Discord 与中文 Swift 开发者深入交流 📚 访问 fatbobman.com 查看数百篇深度原创教程  一起构建更好的 Swift 应用!🚀 Swift 官方发布 Android SDK 10 月 24 日,Swift Android 工


大模型时代的广告营销变革与实践
京东零售技术2025/10/25

大模型时代的广告营销变革与实践 互联网领域,广告营销是一种核心业态,也是先进技术和研究成果的商业化进程最快的一种渠道。伴随生成式大模型的浪潮汹涌袭来,京东广告结合自身业务特性和电商零售的新业态,推出了自主研发的广告营销商业化场景大模型,并据此带来了一场深刻的技术和业务变革。 在2025年9月25日,京东JDD(京东全球科技探索者)大会的Oxygen 智能零售论坛上,京东广告团队做了题为《大模型时代的广告营销变革与实践》的报告。 核心观点 1. 通用大模型想解决营销领域问题需向垂类模型转型。 “全


【Java】基于 Tabula 的 PDF 合并单元格内容提取
Kida的躺平小屋2025/10/22

坑还是要填的,但是填得是否平整就有待商榷了(狗头保命...)。 本人技术有限,只能帮各位实现的这个地步了。各路大神如果还有更好的实现也可以发出来跟小弟共勉一下哈。 首先需要说一下的是以下提供的代码仅作研究参考使用,各位在使用之前务必自检,因为并不是所有 pdf 的表格格式都适合。 本次实现的难点在于 PDF 是一种视觉格式,而不是语义格式。 它只记录了“在 (x, y) 坐标绘制文本 'ABC'”和“从 (x1, y1) 到 (x2, y2) 绘制一条线”。它根本不“知道”什么是“表格”、“


猿辅导Java面试真实经历与深度总结(二)
360_go_php2025/10/22

​ 在面试中,掌握Java的基础知识和深入的理解是非常重要的。今天,我们来解析几个常见的Java面试问题,包括线程状态、线程池、深拷贝与浅拷贝、线程安全、Lock与Synchronized的区别,以及逃逸分析等话题。 1. 线程状态 Java中,线程有七种状态,它们是由 Thread.State 枚举类定义的。线程的状态随着程序的执行而发生变化,下面是七种状态的描述:​编辑 NEW:线程被创建,但尚未启动。 RUNNABLE:线程可以运行,或者已经正在运行。线程调度器选择合适的线程让它执行


Docker 通信核心:docker.sock 完全指南
做运维的阿瑞2025/10/20

阅读时长: 15min | 难度: 中级 | 作者: 做运维的阿瑞 | 更新时间: 2025-10 文章目录 前言一、Docker 通信原理总览1.1 技术架构解析1.2 核心技术对比 二、核心用法与技巧2.1 容器内访问宿主机 Docker2.2 使用 Docker SDK2.3 直接与 API 交互 三、安全风险与最佳实践Q1: 有多危险?为什么说拿到 `docker.sock` 就等于 `root`?Q2: 如何安全地授权用户使用 Docker?Q3: 有没有比挂


自定义Spring Boot Starter项目并且在其他项目中通过pom引入使用
劝导小子2025/10/19

1、创建starter项目 我电脑只有JDK 8,但是创建项目的时候最低只能选择17,后续创建完后去修改即可 2、项目结构 删除主启动类Application:Starter不需要启动类删除配置文件application.properties:Starter不需要自己的配置文件删除test里面的测试启动类 在resources下创建META-INF文件夹 3、修改JDK 修改成JDK8,如果你有更高的版本请切换 4、配置pom.xml <?xml version="1


RabbitMQ消息传输中Protostuff序列化数据异常的深度解析与解决方案
Mr.45672025/10/18

目录 问题背景 环境配置 使用的依赖 测试对象 初始代码(有问题的版本) 问题分析 1. 初步排查 2. 关键发现 3. RabbitTemplate的默认行为分析 4. SimpleMessageConverter的处理机制 深入理解消息转换 消息转换器的层次结构: 而直接发送 Message: 解决方案 方案1:直接使用Message对象(推荐) 方案2:配置自定义MessageConverter 问题根因总结 经验教训 结论 最后最后附上序列化工具:


Apache Doris 与 ClickHouse:运维与开源闭源对比
SelectDB技术团队2025/10/16

引言 在当今数据驱动的商业环境中,OLAP(在线分析处理)数据库的选择对企业的数据分析能力和运维成本有着深远影响。Apache Doris 和 ClickHouse 作为业界领先的高性能 OLAP 数据库,各自在不同场景下展现出独特优势。 Apache Doris 以其优秀的宽表查询能力、多表 JOIN 性能、实时更新、search 以及湖加速特性而著称。ClickHouse 同样在宽表处理方面表现出色,其丰富的分析函数库和高性能单表聚合能力备受青睐。 然而,从运维角度来看,两者在存算分离


统一高效图像生成与编辑!百度&新加坡国立提出Query-Kontext,多项任务“反杀”专用模型
AI生成未来2025/10/15

论文链接:https://arxiv.org/pdf/2509.26641 亮点直击 Query-Kontext,一种经济型集成多模态模型(UMM),能够将视觉语言模型(VLMs)中的多模态生成推理与扩散模型执行的高保真视觉渲染相分离。 提出了一种三阶段渐进式训练策略,该策略逐步将 VLM 与越来越强大的扩散生成器对齐,同时增强它们在生成推理和视觉合成方面的各自优势。 提出了一种精心策划的数据集收集方案,以收集真实、合成和经过仔细筛选的开源数据集,涵盖多样的多模态参考到图像

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0