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.mzph.cn/news/509406.shtml

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

相关文章

数据结构实验之排序四:寻找大富翁

题目描述 2015胡润全球财富榜调查显示&#xff0c;个人资产在1000万以上的高净值人群达到200万人&#xff0c;假设给出N个人的个人资产值&#xff0c;请你快速找出排前M位的大富翁。 输入 首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10)&#xff0c;其中N为总人数&#xff0c;M为…

系统调用和库函数的区别

首先&#xff0c;要说一下两者的概念&#xff1a;系统调用 &#xff1a;是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口&#xff0c;即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。再来说…

数据结构实验之排序五:归并求逆序数

题目描述 对于数列a1,a2,a3…中的任意两个数ai,aj (i < j)&#xff0c;如果ai > aj,那么我们就说这两个数构成了一个逆序对&#xff1b;在一个数列中逆序对的总数称之为逆序数&#xff0c;如数列 1 6 3 7 2 4 9中&#xff0c;(6,4)是一个逆序对&#xff0c;同样还有(3,2)…

gSoap客户端调用WebService完成后注意内存释放顺序

gSoap客户端调用WebService完成后注意内存释放顺序 [cpp] view plaincopy //Soap资源清理 soap_destroy(soap_sp.get()); //清理反序列化的类实例 soap_end(soap_sp.get()); //清理反序列化的数据 &#xff08;除类实例&#xff09; 和临时数据清理…

spring面向AOP之动态代理

动态代理中有两个重要的接口&#xff0c;一个是InvocationHandle&#xff0c;另一个是Proxy。 分别来说明这两个接口的作用吧&#xff01; InvocationHandle接口‘ java.lang.reflect.InvocationHandler InvocationHandler 是代理实例的调用处理程序 实现的接口。每个代理实…

数据结构实验之排序六:希尔排序

题目描述 我们已经学习了各种排序方法&#xff0c;知道在不同的情况下要选择不同的排序算法&#xff0c;以期达到最好的排序效率&#xff1b;对于待排序数据来说&#xff0c;若数据基本有序且记录较少时&#xff0c; 直接插入排序的效率是非常好的&#xff0c;希尔排序就是针对…

spring整合JDBC

文章目录spring提供了很多模板整合Dao技术spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术.如何用Spring中的jdbc模板对数据库操作&#xff1a;spring配置进阶内容JDBCDaoSupport的使用spring提供了很多模板整合Dao技术 因为在jdbc、Hibernate、Mybatis中都有对数据…

稳定排序和不稳定排序

http://blog.csdn.net/rebirth_love/article/details/52354338 这几天笔试了好几次了&#xff0c;连续碰到一个关于常见排序算法稳定性判别的问题&#xff0c;往往还是多选&#xff0c;对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目&#xff0c;当然如果你笔试之…

spring中aop事务

文章目录事务为什要用到Spring中AOP事务事物的特性 ACID事务并发问题事务的隔离级别spring事务管理事务操作事务操作对象spring管理事务的属性介绍spring管理事务方式编码式xml配置(aop)注解配置Transactional注解在方法上添加Transactional注解在类上添加实际案例xml配置注入a…

Mybatis介绍、jdbc操作数据库原始写法以及Mybatis架构

文章目录Mybatis介绍jdbc操作数据库原生写法使用jdbc编程问题总结Mybatis架构Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个…

数据结构上机测试2-1:单链表操作A

题目描述 输入n个整数&#xff0c;先按照数据输入的顺序建立一个带头结点的单链表&#xff0c;再输入一个数据m,将单链表中的值为m的结点全部删除。分别输出建立的初始单链表和完成删除后的单链表。输入 第一行输入数据个数n&#xff1b;第二行依次输入n个整数&#xff1b;第三…

数据结构上机测试2-2:单链表操作B

题目描述 按照数据输入的相反顺序&#xff08;逆位序&#xff09;建立一个单链表&#xff0c;并将单链表中重复的元素删除&#xff08;值相同的元素只保留最后输入的一个&#xff09;。输入 第一行输入元素个数n&#xff1b;第二行输入n个整数。输出 第一行输出初始链表元素个数…

利用Mybatis写第一个数据库操作的程序

文章目录mybatis下载业务需求环境搭建加入配置文件创建pojosql映射文件加载映射文件实现根据id查询用户测试程序&#xff1a;效果mybatis下载 mybaits的代码由github.com管理 下载地址&#xff1a;https://github.com/mybatis/mybatis-3/releases 下载的mybatis文件如下&#…

数据结构实验之链表六:有序链表的建立

题目描述 输入N个无序的整数&#xff0c;建立一个有序链表&#xff0c;链表中的结点按照数值非降序排列&#xff0c;输出该有序链表。输入 第一行输入整数个数N&#xff1b;第二行输入N个无序的整数。输出 依次输出有序链表的结点值。示例输入 6 33 6 22 9 44 5 示例输出 5 6 9…

利用Mybatis对数据库进行增删改查操作

文章目录mybatis模糊查找先来了解一下 #{}和${}的使用parameterType和resultType的使用selectOne和selectList的使用mysql自增主键返回方法一&#xff1a;mysql的函数函数返回方法二&#xff1a;定义useGeneratedKeys为true返回Mysql使用 uuid实现主键看到UUID和自增长的id想必…

原始Dao开发方法以及存在的问题

存在的问题&#xff1a; 原始Dao开发中存在以下问题&#xff1a; 1.Dao方法体存在重复代码&#xff1a;通过SqlSessionFactory创建SqlSession&#xff0c;调用SqlSession的数据库操作方法 2.调用sqlSession的数据库操作方法需要指定statement的id&#xff0c;这里存在硬编码&am…

聚合和组合的关系

转自&#xff1a;http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 记得在当时学习uml总是不好分清聚合与组合的关系&#xff0c;找工作时特地复习了这块的内容&#xff0c;结果正巧被面试官问道&#xff0c;这两天又在搞这块的内容&#xff0c;对聚合与组合…

Message Flood

题目描述 Well, how do you feel about mobile phone? Your answer would probably be something like that "Its so convenient and benefits people a lot". However, If you ask Merlin this question on the New Years Eve, he will definitely answer "Wh…

关联和依赖的区别

最近研究设计模式&#xff0c;看类图有点发虚&#xff01;有些关系搞的不是很清楚。所以整理一下&#xff1a; 类与类之间由弱到强关系是: 没关系 > 依赖 > 关联 > 聚合 > 组合。 类和类之间八竿子打不着那就是没关系&#xff0c;这个没啥歧义。 依赖(dependenc…