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

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

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

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

一、寻路算法概述

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

DFS寻路示例

0123456

从顶点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. 构造函数初始化

publicPath(Graph graph,int s){G= graph;assert s >=0&& s <G.V(); visited =newboolean[G.V()]; from =newint[G.V()];for(int i =0; i <G.V(); i++){ visited[i]=false; from[i]=-1;}this.s = s;dfs(s);}

3. DFS实现

privatevoiddfs(int v){ visited[v]=true;for(int i :G.adj(v)){if(!visited[i]){ from[i]= v;// 记录前驱顶点dfs(i);}}}

4. 路径查询方法

booleanhasPath(int w){assert w >=0&& w <G.V();return visited[w];}Vector<Integer>path(int w){asserthasPath(w);Stack<Integer> s =newStack<>();int p = w;while(p !=-1){ s.push(p); p = from[p];}Vector<Integer> res =newVector<>();while(!s.empty()) res.add(s.pop());return res;}

四、完整代码实现

importjava.util.Stack;importjava.util.Vector;/** * 基于DFS的寻路算法 */publicclassPath{privateGraphG;// 图的引用privateint s;// 起始点privateboolean[] visited;// 记录访问过的节点privateint[] from;// 记录路径,from[i]表示i的前驱节点// 构造函数,寻路算法publicPath(Graph graph,int s){G= graph;assert s >=0&& s <G.V(); visited =newboolean[G.V()]; from =newint[G.V()];for(int i =0; i <G.V(); i++){ visited[i]=false; from[i]=-1;}this.s = s;// 开始DFS寻路dfs(s);}// 深度优先遍历privatevoiddfs(int v){ visited[v]=true;for(int i :G.adj(v)){if(!visited[i]){ from[i]= v;dfs(i);}}}// 判断是否有路径booleanhasPath(int w){assert w >=0&& w <G.V();return visited[w];}// 获取路径Vector<Integer>path(int w){asserthasPath(w);Stack<Integer> stack =newStack<>();int p = w;while(p !=-1){ stack.push(p); p = from[p];}Vector<Integer> res =newVector<>();while(!stack.empty()) res.add(stack.pop());return res;}// 打印路径voidshowPath(int w){asserthasPath(w);Vector<Integer> vec =path(w);for(int i =0; i < vec.size(); i++){System.out.print(vec.elementAt(i));if(i != vec.size()-1)System.out.print(" -> ");}System.out.println();}}

五、算法测试与应用

测试代码

publicclassPathTest{publicstaticvoidmain(String[] args){// 创建一个图Graph g =newSparseGraph(7,false); g.addEdge(0,1); g.addEdge(0,2); g.addEdge(1,3); g.addEdge(1,4); g.addEdge(2,5); g.addEdge(4,6);// 寻路算法测试Path path =newPath(g,0);System.out.println("Path from 0 to 6:"); path.showPath(6);// 输出:0 -> 1 -> 4 -> 6System.out.println("Path from 0 to 5:"); path.showPath(5);// 输出:0 -> 2 -> 5System.out.println("Has path to 3: "+ path.hasPath(3));System.out.println("Has path to 6: "+ path.hasPath(6));}}

输出结果

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

六、算法分析与优化

时间复杂度分析

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

空间复杂度

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

优化方向

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

七、DFS寻路与BFS寻路对比

起点DFS vs BFSDFSBFS使用栈/递归不一定是最短路径使用队列保证最短路径

选择建议

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

八、实际应用场景

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

九、总结

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

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

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

在这里插入图片描述

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

Read more

在家玩 AI 绘图还能远程协作?ComfyUI+Flux.1结合cpolar的实用技巧

在家玩 AI 绘图还能远程协作?ComfyUI+Flux.1结合cpolar的实用技巧

文章目录 * 前言 * 1. 本地部署ComfyUI * 2. 下载 Flux.1 模型 * 3. 下载CLIP模型 * 4. 下载 VAE 模型 * 5. 演示文生图 * 6. 公网使用 Flux.1 大模型 * 6.1 创建远程连接公网地址 * 7. 固定远程访问公网地址 前言 ComfyUI 是一款灵活的 AI 绘图工具,搭配 Flux.1 模型能实现文本生成图像的功能,适合设计师、创作者用来制作图片素材。它的优点是可以通过节点拖拽搭建绘图流程,能精细控制生成效果,而且开源免费,适合需要自定义绘图过程的用户。 使用时感觉 Flux.1 模型的生成效果不错,尤其是色彩和场景合理性方面表现较好。不过要注意,不同版本的模型对电脑配置要求不同,比如有些版本需要较大显存,

By Ne0inhk
构建基于Go语言的高性能命令行AI对话客户端:从环境部署到核心实现

构建基于Go语言的高性能命令行AI对话客户端:从环境部署到核心实现

前言 在现代软件开发领域,Go语言凭借其卓越的并发处理能力、静态类型安全以及高效的编译速度,已成为构建命令行工具(CLI)的首选语言之一。本文将详细阐述如何在Ubuntu Linux环境下部署Go开发环境,并结合蓝耘(Lanyun)提供的DeepSeek大模型API,手写一个支持多轮对话、上下文记忆的智能终端聊天工具。 一、 基础运行环境的准备与构建 任何上层应用的稳健运行都离不开坚实的底层系统支持。本次部署的目标环境为Ubuntu LTS系列(20.04/22.04/24.04),这些长期支持版本保证了系统库的稳定性与安全性。硬件层面,建议配置至少1GB的内存与5GB的磁盘空间,以满足编译器运行及依赖包缓存的需求。 1. 系统包索引更新与系统升级 在进行任何开发工具安装之前,首要任务是确保操作系统的软件包索引与现有软件处于最新状态。这不仅能修复已知的安全漏洞,还能避免因依赖库版本过旧导致的编译错误。 执行系统更新操作: sudoapt update &&sudoapt upgrade -y 该指令分为两部分:apt update 用于从软件源服务器获取最新的软件包列

By Ne0inhk

Trae IDE 安装与使用保姆级教程:字节跳动的 AI 编程神器

一、Trae 是什么? Trae(发音 /treɪ/)是字节跳动推出的 AI 原生集成开发环境(AI IDE),于 2025 年 1 月正式发布。与传统的 IDE + AI 插件组合不同,Trae 从底层架构上就将 AI 能力深度集成,实现了真正意义上的"AI 主导开发"。 核心定位 Trae 以 “自主智能体(Agent)” 为核心定位,彻底重构了传统开发流程: * Chat 模式:智能代码补全、问答、解释和优化 * Builder 模式:自然语言一键生成完整项目框架 * SOLO 模式:AI 自主规划并执行开发任务 版本划分 版本定位核心特色适用人群Trae

By Ne0inhk
openJiuwen集成蓝耘AI模型深度解析:从架构设计到企业级Agent实战部署

openJiuwen集成蓝耘AI模型深度解析:从架构设计到企业级Agent实战部署

前言 在人工智能技术从单纯的感知智能向认知智能演进的浪潮中,大语言模型(LLM)的成熟催生了AI Agent(人工智能体)这一全新的应用形态。AI Agent不再局限于传统的单指令执行,而是演进为具备自主感知、推理规划、决策执行能力的智能实体。在这一技术变革背景下,openJiuwen作为一个致力于提供灵活、强大且易用能力的开源Agent平台应运而生。本文将深度剖析openJiuwen的技术架构、核心优势,并基于真实的服务器部署环境,详细拆解从底层环境搭建到上层复杂智能体构建的全过程。 一、 Agentic AI时代的基础设施:openJiuwen概览 openJiuwen的定位不仅是一个开发工具,而是面向生产级应用的Agent全生命周期管理平台。它旨在解决当前大模型应用落地过程中面临的开发门槛高、协同调度难、运行稳定性差等痛点。通过提供标准化的开发框架与高可靠的运行引擎,openJiuwen支持开发者快速构建能够处理各类简单或复杂任务的AI Agent,并实现多Agent间的协同交互。 作为核心代码资产的入口,开发者能在这里查看项目的 Readme 文档、分支管理和最新提交

By Ne0inhk