java实现深度优先搜索 (DFS) 算法

度优先搜索(Depth First Search,DFS)算法是一种用于遍历或搜索图或树的算法。这种算法从一个节点开始,沿着一条路径尽可能深地搜索,直到遇到不能继续前进的节点时返回上一个节点,然后继续搜索其他路径。具体步骤如下:

  1. 选择一个起始节点作为当前节点,并将其标记为已访问。
  2. 尝试从当前节点出发,依次访问其未访问的邻接节点。
  3. 对于每个邻接节点,如果它未被访问过,则将其设为当前节点,并进行深度优先搜索。
  4. 如果当前节点没有未访问的邻接节点,返回上一个节点,将其设为当前节点,并继续搜索其他路径。
  5. 重复步骤2-4,直到所有节点都被访问。

深度优先搜索算法通常使用递归实现,因为它能够自然地利用函数调用栈来保存当前节点的状态。在实际应用中,深度优先搜索算法可以用来解决迷宫问题、拓扑排序、连通性判断等问题。

以下是Java实现深度优先搜索(DFS)算法的示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;class Graph {private int V; // 顶点数量private List<List<Integer>> adj; // 邻接表public Graph(int V) {this.V = V;adj = new ArrayList<>(V);for (int i = 0; i < V; ++i)adj.add(new ArrayList<>());}// 添加边public void addEdge(int v, int w) {adj.get(v).add(w);}// 递归实现DFSprivate void DFSUtil(int v, boolean[] visited) {visited[v] = true;System.out.print(v + " ");for (int i : adj.get(v)) {if (!visited[i])DFSUtil(i, visited);}}// DFS遍历public void DFS(int v) {boolean[] visited = new boolean[V];DFSUtil(v, visited);}// 迭代实现DFSpublic void DFSIterative(int v) {boolean[] visited = new boolean[V];Stack<Integer> stack = new Stack<>();stack.push(v);while (!stack.isEmpty()) {v = stack.pop();if (!visited[v]) {visited[v] = true;System.out.print(v + " ");for (int i : adj.get(v)) {if (!visited[i]) {stack.push(i);}}}}}
}public class Main {public static void main(String[] args) {Graph graph = new Graph(6);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 3);graph.addEdge(2, 4);graph.addEdge(2, 5);System.out.println("DFS recursive:");graph.DFS(0);System.out.println("\nDFS iterative:");graph.DFSIterative(0);}
}

本示例中,我们首先创建了一个Graph类表示图。构造函数中,我们初始化了邻接表adj,并定义了边的连接关系。

然后,我们实现了递归和迭代版本的DFS。递归版本的DFS使用了一个辅助函数DFSUtil来进行递归的深度优先搜索。迭代版本的DFS使用了一个Stack来保存待访问的顶点。

在Main函数中,我们创建了一个具有6个顶点的图,并添加了几条边。接着,我们分别调用了递归和迭代版本的DFS来进行深度优先搜索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224358.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.…

vs code 代码统计 插件 (webstorm统计代码)

https://blog.csdn.net/aikudexiaohai/article/details/129367503 安装插件 VS Code Counter使用快捷键 Ctrl Shift P&#xff0c;搜素“VSCodeCounter”&#xff0c;选择 Count lines in directory。 在文件路径搜索框中&#xff0c;补充待统计的目录&#xff0c;如&#x…

家校互通小程序实战开发01需求分析

目录 1 角色的划分2 用例分析3 创建业务数据源4 创建登录用户数据源总结 最近几年&#xff0c;随着移动互联网的深入发展&#xff0c;我们的日常生活和工作和微信已经紧密绑定。其实&#xff0c;有时候生活和工作的界限已经不明显&#xff0c;在我们的微信好友里既有家人、朋友…

看图了解ODF光纤配线架,详细熔接过程学习

弱电工程&#xff0c;远距离传输离不开光纤&#xff0c;只有光纤才能让网络传输的更远&#xff0c;今天了解光纤的配套产品&#xff0c;光纤配线架&#xff08;Optical Distribution Frame&#xff09;用于光纤通信系统中局端主干光缆的成端和分配&#xff0c;可方便地实现光纤…

多维时序 | MATLAB实CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测预测效果基本介…

一起玩儿物联网人工智能小车(ESP32)——14. 用ESP32的GPIO控制智能小车运动起来(二)

摘要&#xff1a;本文主要讲解如何使用Mixly实现对单一车轮的运动控制。 下面就该用程序控制我们的小车轮子转起来了。打开Mixly软件&#xff0c;然后单击顶部“文件”菜单中的“新建”功能&#xff0c;我们来开启一个新程序的开发工作。 我们的工作同样是先从最简单的开始&am…

等级保护实施指南与定级指南标准

目录 前言 等级保护实施指南标准 主要思路 主要概念 实例 主要流程 等级保护定级指南标准 安全保护等级 定级原理 级别划分表 定级方法 业务信息安全保护等级矩阵表 系统服务安全保护等级矩阵表 补充内容 前言 《实施指南》介绍和描述了实施信息系统等级保护过…

本地部署Jellyfin影音服务器并实现远程访问内网影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder

现代大型语言模型&#xff08;LLM&#xff09;的演变进化树&#xff0c;如下图&#xff1a; https://arxiv.org/pdf/2304.13712.pdf 基于 Transformer 模型以非灰色显示&#xff1a; decoder-only 模型在蓝色分支&#xff0c; encoder-only 模型在粉色分支&#xff0c; encod…

前端工程注入版本号

文章目录 一、前言二、webpack三、vite四、最后 一、前言 容器化时代&#xff0c;当页面出现问题时&#xff0c;如果你的新版本有可能已经修复了&#xff0c;那样你再排查它就没有意义了。为什么不一定是最新版本呢&#xff1f;一是可能是缓存作祟&#xff0c;二是可能运维成员…

Linux部署MeterSphere结合内网穿透实现远程访问服务管理界面

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

fragstats:景观指数趋势分析

作者&#xff1a;CSDN _养乐多_ 本文将介绍景观指数时间序列的趋势分析&#xff0c;包括趋势类型、斜率、截距等。以及景观指数突变分析所用的软件和 python 代码。 结果如下图所示&#xff0c; 图1 趋势分类图 图2 MK趋势分析 文章目录 一、景观指数计算二、景观指数时间序…

如何将本地websocket发布至公网并实现远程访问服务端

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

山海鲸开发者带你了解智慧医疗

在医疗行业日新月异的今天&#xff0c;可视化技术正在逐渐改变我们对医疗的认知与实践。作为山海鲸可视化软件的开发者&#xff0c;我们深知可视化技术在智慧医疗领域的重要性。通过山海鲸可视化这款免费编辑、免费分享的数字孪生软件&#xff0c;我们致力于为智慧医疗领域提供…

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一…

C++11(上):新特性讲解

C11新特性讲解 前言1.列表初始化1.1{ }初始化1.2std::initializer_list 2.类型推导2.1 auto2.2 typeid2.3 decltype 3.范围for4.STL的变化4.1新容器4.2容器的新方法 5.右值引用和移动语义5.1 左值引用和右值引用5.2 左值引用与右值引用比较5.3 右值引用的使用场景5.4 右值、左值…

【MySQL】:超详细MySQL完整安装和配置教程

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. MySQL数据库1.1 版本1.2 下载1.3 安装1.4 客户端连接 &#x1f324;️全篇总…

生物神经网络衍生出的算法

一个生物神经网络的基本结构&#xff1a; 生物神经网络由大量神经元组成&#xff0c;这些神经元之间通过突触相互连接。神经元可以接收来自其他神经元的信号&#xff0c;并根据信号的强度和类型来调整自己的输出信号。这种神经元之间的相互连接和信号传递形成了生物神经网络的基…

Vue 封装echarts饼状图(Pie)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 效果显示&#xff1a; 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title"><div>{{ title }}</div>…

如何通过蓝牙串口启动智能物联网?

1、低功耗蓝牙(BLE)介绍 BLE 技术是一种低成本、短距离、可互操作的鲁棒性无线技术&#xff0c;工作在免许可的 2,4 GHZ 工业、科学、医学(Industrial Scientific Medical&#xff0c;ISM)频段。BLE在设计之初便被定位为一种超低功耗(Ultra Low Power&#xff0c;ULP)无线技术&…