Java图搜索算法详解:探索图论中的奥秘

图搜索算法是图论领域的重要内容,它在解决各种实际问题中起着关键作用。本文将详细介绍几种常见的Java图搜索算法,包括深度优先搜索(DFS)、广度优先搜索(BFS)以及Dijkstra算法,帮助读者深入理解图搜索算法的原理和应用。

1. 深度优先搜索(DFS)

深度优先搜索是一种递归的搜索算法,它从图的某一顶点出发,沿着一条路径尽可能深地搜索,直到到达最远的顶点,然后再回溯到上一个顶点,继续搜索其他路径。DFS通常使用栈来实现,其时间复杂度为O(V+E),其中V是顶点数,E是边数。

import java.util.*;public class DepthFirstSearch {private boolean[] visited;private List<List<Integer>> graph;public DepthFirstSearch(int n) {visited = new boolean[n];graph = new ArrayList<>();for (int i = 0; i < n; i++) {graph.add(new ArrayList<>());}}public void addEdge(int u, int v) {graph.get(u).add(v);}public void dfs(int u) {visited[u] = true;System.out.print(u + " ");for (int v : graph.get(u)) {if (!visited[v]) {dfs(v);}}}public static void main(String[] args) {DepthFirstSearch dfs = new DepthFirstSearch(5);dfs.addEdge(0, 1);dfs.addEdge(0, 2);dfs.addEdge(1, 3);dfs.addEdge(1, 4);dfs.dfs(0); // 从节点0开始深度优先搜索}
}

2. 广度优先搜索(BFS)

广度优先搜索是一种迭代的搜索算法,它从图的某一顶点出发,逐层地搜索,直到找到目标顶点或者遍历完所有顶点。BFS通常使用队列来实现,其时间复杂度同样为O(V+E)。

import java.util.*;public class BreadthFirstSearch {private boolean[] visited;private List<List<Integer>> graph;public BreadthFirstSearch(int n) {visited = new boolean[n];graph = new ArrayList<>();for (int i = 0; i < n; i++) {graph.add(new ArrayList<>());}}public void addEdge(int u, int v) {graph.get(u).add(v);}public void bfs(int u) {Queue<Integer> queue = new LinkedList<>();visited[u] = true;queue.offer(u);while (!queue.isEmpty()) {int cur = queue.poll();System.out.print(cur + " ");for (int v : graph.get(cur)) {if (!visited[v]) {visited[v] = true;queue.offer(v);}}}}public static void main(String[] args) {BreadthFirstSearch bfs = new BreadthFirstSearch(5);bfs.addEdge(0, 1);bfs.addEdge(0, 2);bfs.addEdge(1, 3);bfs.addEdge(1, 4);bfs.bfs(0); // 从节点0开始广度优先搜索}
}

3. Dijkstra算法

Dijkstra算法是一种用于计算图中单源最短路径的贪心算法,它通过维护一个优先队列来选择下一个要访问的顶点,并不断更新顶点到源顶点的最短距离。Dijkstra算法适用于边权值非负的有向图或无向图,其时间复杂度为O(V^2),其中V是顶点数。

import java.util.*;public class Dijkstra {private int[] dist;private boolean[] visited;private List<List<int[]>> graph;public Dijkstra(int n) {dist = new int[n];visited = new boolean[n];Arrays.fill(dist, Integer.MAX_VALUE);graph = new ArrayList<>();for (int i = 0; i < n; i++) {graph.add(new ArrayList<>());}}public void addEdge(int u, int v, int w) {graph.get(u).add(new int[] { v, w });}public void dijkstra(int src) {PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));dist[src] = 0;pq.offer(new int[] { src, 0 });while (!pq.isEmpty()) {int[] cur = pq.poll();int u = cur[0];if (visited[u]) continue;visited[u] = true;for (int[] edge : graph.get(u)) {int v = edge[0];int w = edge[1];if (!visited[v] && dist[u] + w < dist[v]) {dist[v] = dist[u] + w;pq.offer(new int[] { v, dist[v] });}}}}public static void main(String[] args) {Dijkstra dijkstra = new Dijkstra(5);dijkstra.addEdge(0, 1, 10);dijkstra.addEdge(0, 2, 5);dijkstra.addEdge(1, 3, 2);dijkstra.addEdge(2, 1, 3);dijkstra.addEdge(2, 3, 9);dijkstra.dijkstra(0); // 从节点0开始Dijkstra算法}
}

结论

Java图搜索算法是图论中的重要内容,掌握这些算法对于解决各种实际问题至关重要。通过本文的介绍和实例演示,读者可以更加深入地理解深度优先搜索、广度优先搜索和Dijkstra算法的原理和应用,为解决实际问题提供了强有力的工具和思路。

  感谢您阅读本文,欢迎“一键三连”。作者定会不负众望,按时按量创作出更优质的内容。
❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。

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

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

相关文章

RSA加密---java和node兼容版(可直接复制使用)

目录 背景 实现 一、node代码 1、引入依赖 2、生成公钥和私钥 3、生成工具类 二、java代码 背景 本来项目的后端是node&#xff0c;里面登录接口用的是后端生成RSA公钥和私钥&#xff0c;公钥给前端网页用来加密&#xff0c;node后端解密&#xff0c;一切很和谐&#x…

什么是MOM?为什么它是趋势

制造运营管理&#xff08;MOM&#xff09; 制造运营管理&#xff08;MOM&#xff09;旨在优化制造流程的效率和有效性。它涵盖制造执行、质量管理、生产计划和调度以及制造智能等功能。这种解决方案以全面的方式管理和增强制造流程。 MOM的功能特点 对于MOM的功能特点来说&…

Office Word自动编号转文本

原理 使用office自带的宏功能&#xff0c;一键替换 过程 调出word的“开发工具”选项 文件->选项->自定义功能区->选中开发工具->确定 创建宏 开发工具->宏->创建宏 编写宏 在弹出来的框里&#xff0c;替换代码为 Sub num2txt() ActiveDocument.…

前端请求没问题,后端正常运行,但查不出数据

写代码时写得快了些&#xff0c;Orders.的订单状态写错了CONFIRMED 改成COMPLETED

selenium 4.x 入门(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型…

C++栈和队列模拟

栈和队列所用的容器默认都为deque&#xff0c;这种容器可以看作是一种vector和list的中间性能容器。 而deque虽然头插、尾插效率很好&#xff0c;且支持 [ ] 访问&#xff08;默认容器为它的原因&#xff09;&#xff0c;但是 他的缺点也很明显&#xff1a; 1.中间插入删除会…

Git中单独的功能特性分支是什么含义

在Git中&#xff0c;一个"功能特性分支"&#xff08;通常简称为“特性分支”&#xff09;是指从主开发分支&#xff08;比如main或master&#xff09;独立出来的分支&#xff0c;专门用于开发一个新功能、修复一个bug&#xff0c;或者进行实验性的尝试。使用特性分支…

git误操作版本回退的方法

场景&#xff1a;在使用git进行代码提交的时候不小心执行了git reset 命令进行了版本回退但是在这之前进行了git add . git commit -m "提交"等命令&#xff0c;正常情况下就可以直接使用 git reset 版本号 进行代码的回退&#xff0c;但是发现自己不能找打上一个提…

某985证书站挖掘记录

0x1.前言 本文章仅用于信息安全防御技术分享&#xff0c;因用于其他用途而产生不良后果&#xff0c;作者不承担任何法律责任&#xff0c;请严格遵循中华人民共和国相关法律法规&#xff0c;禁止做一切违法犯罪行为。文中涉及漏洞均以提交至教育漏洞平台&#xff0c;现已修复。 …

微服务之分布式理论zookeeper概述

一、分布式技术相关的理论 CAP理论 CAP定理(CAP theorem)&#xff0c;⼜被称作布鲁尔定理(Eric Brewer)&#xff0c;1998年第⼀次提出. 最初提出是指分布式数据存储不可能同时提供以下三种保证中的两种以上: (1) ⼀致性(Consistency): 每次读取收到的信息都是最新的; (2) …

Macs Fan Control Pro for mac激活版:macOS 平台的风扇控制软件

Macs Fan Control Pro是一款用于 macOS 平台的风扇控制软件&#xff0c;它允许用户监控和调整 Mac 电脑的风扇转速。以下是该软件的一些特点和功能&#xff1a; Macs Fan Control Pro for mac激活版下载 风扇监控&#xff1a;Macs Fan Control Pro 提供实时的风扇转速监控&…

uniapp关于iconfont字体图标使用

1、打开[阿里巴巴矢量图标库](https://www.iconfont.cn/)&#xff0c;选择需要的图标添加到购物车 2、点开购物车&#xff0c;将图标添加到项目 3、点开项目&#xff0c;点击下载至本地&#xff0c;会得到一个download.zip包 4、解压download包 5、将包里的iconfont.css和iconf…

Java从菜鸟到高手①

目录 1.数据类型 2.定义变量 2.1.编码方式 2.2.布尔型变量boolean 2.3.隐式类型转化和强制类型转化 2.4类型提升 3.字符串类型 4.运算符 4.1.取余 4.2. &#xff0c;- 4.3逻辑运算&& || &#xff01; 4.4.位运算 4.5.条件运算符 1.数据类型 Java中&#…

2024智能科学与软件工程国际学术会议(ICISSE 2024)

2024智能科学与软件工程国际学术会议&#xff08;ICISSE 2024) 会议简介 2024智能科学与软件工程国际学术会议&#xff08;ICISSE 2024&#xff09;将在北京隆重举行。本次会议汇集了全球智能科学和软件工程领域的专家学者&#xff0c;共同探讨该领域的最新研究成果和发展趋…

超详细的Vue脚手架

文章目录 Node.js介绍安装快速入门控制台输出使用函数模块化编程 npm包管理器介绍命令初始化命令本地安装(了解)全局安装(掌握)批量下载淘宝npm镜像(建议使用) Webpack介绍安装快速入门方式一&#xff1a;webpack原始方式方式二&#xff1a;基于NPM方式 webpack-dev-server 开发…

2024年第十五届蓝桥杯江苏省赛回顾

呜呜呜~~~ 我在考完了后感觉自己直接炸了&#xff1a;好多学到的算法都没有用上&#xff0c;几乎所有的题目都是暴力的。。。 最后十几分钟对于一道dp算法终于有思路了&#xff0c;但是。。匆匆忙忙之间就是没有调试出来。&#xff08;还是交了一道暴力[旋风狗头]直接哭死~~&…

设计模式学习笔记 - 开源实战五(下):总结Mybatis中用到的10种设计模式

概述 本章再对 Mybatis 用到的设计模式做一个总结。它用到的设计模式也不少。有些前面章节已经经过了&#xff0c;有些则比较简单。 SqlSessionFactoryBuilder&#xff1a;为什么要用建造者模式来创建 SqlSessionFactory&#xff1f; 在《Mybatis如何权衡易用性、性能和灵活性…

鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班

本篇通过拆解一段很简单的汇编代码来快速认识汇编&#xff0c;为读懂鸿蒙汇编打基础.系列篇后续将逐个剖析鸿蒙的汇编文件. 汇编很简单 第一&#xff1a; 要认定汇编语言一定是简单的&#xff0c;没有高深的东西&#xff0c;无非就是数据的搬来搬去&#xff0c;运行时数据主要…

高等学校数字化校园平台介绍

高等学校信息化建设已经进入到跨业务领域信息共享、建立全校统一集成的信息系统阶段&#xff0c;目标是实现整个学校的系统集成、信息共享与工作协同。因此&#xff0c;如何将众多应用系统中大量的信息进行科学、规范的定义和分类&#xff0c;使信息有序流通、保证信息的一致性…

IP定位技术企业网络安全检测

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为企业运营中不可忽视的一环。在众多网络安全技术中&#xff0c;IP定位技术以其独特的优势&#xff0c;为企业网络安全检测提供了强有力的支持。本文将深入探讨IP定位技术在企业网络安全检测中的应用及其…