Java实现基于邻接表的图的深度和广度遍历

在Java中用邻接表实现图(Graph)的存储、搜索和遍历 在Java中用邻接表实现图(Graph)的存储、搜索和遍历 用邻接表存储图,是使用了数组+链表的结构。 上面这张图就是一个用邻接表存储图的例子。图片上方就是这个链表所存储的图。下半部分是存储的结构。 构造存储数据的类 首先,数组的长度和图中的顶点个数相同,数组中的每个元素代表一个图中的顶点,**数组元素的下标就是该顶点的编号。**如G[0]就代表顶点0,以此类推。 数组中的一个元素也就是一个顶点... 阅读详情

Java实现基于邻接表的图的深度和广度遍历

Graph类:

package graph1;

import java.util.LinkedList;

import graph.Graph.edgeNode;

public class Graph {

	class EdgeNode{
			int adjvex;
			EdgeNode nextEdge;
	}
	
	class VexNode{
		int data;
		EdgeNode firstEdge;
		boolean isVisted;
		public boolean isVisted() {
			return isVisted;
		}
		public void setVisted(boolean isVisted) {
			this.isVisted = isVisted;
		}
		
	}

	VexNode[] vexsarray ;
	int[] visited = new int[100];
	boolean[] isVisited = new boolean[100];
	
	public void linkLast(EdgeNode target,EdgeNode node) {
		while (target.nextEdge!=null) {
			target=target.nextEdge;
		}
		target.nextEdge=node;
	}
	
	public int getPosition(int data) {
			for(int i=0;i<vexsarray.length;i++) {
				if (data==vexsarray[i].data) {
						return i;
				}
			}
				return -1;
	}
	
	
	public void buildGraph(int[] vexs,int[][] edges ) {
		int vLen = vexs.length;
		int eLen = edges.length;
		vexsarray = new VexNode[vLen];
		
		for(int i=0;i<vLen;i++) {
			vexsarray[i] = new VexNode();
			vexsarray[i].data = vexs[i];
			vexsarray[i].firstEdge = null;
		}
		
		for(int i=0;i<eLen;i++) {
			
			int a = edges[i][0];
			int b = edges[i][1];
			
			int start = getPosition(a);
			int end = getPosition(b);
			
			EdgeNode edgeNode = new EdgeNode();
			edgeNode.adjvex = end;
			
			if (vexsarray[start].firstEdge == null) {
				vexsarray[start].firstEdge = edgeNode;
			} else {
				linkLast(vexsarray[start].firstEdge,edgeNode);
			}
		}
	}
	
	
	public void printGraph() {
		for(int i=0;i<vexsarray.length;i++) {
			System.out.printf("%d--",vexsarray[i].data);
			EdgeNode node = vexsarray[i].firstEdge;
			while (node!=null) {
				System.out.printf("%d--",vexsarray[node.adjvex].data);
				node = node.nextEdge;
			}
			System.out.println("\n");
		}
	}
	
	/*
	 * 深度遍历
	 */
	
	public void DFS(int vex) {
		
			int w;
			EdgeNode node;
			visited[vex] = 1;
			System.out.println(vex);
			node=vexsarray[getPosition(vex)].firstEdge;
			while (node!=null) {
				w=node.adjvex;
				if (visited[vexsarray[w].data]==0) {
					DFS(vexsarray[w].data);
				}
				node=node.nextEdge;
			}
	}
	
	/*
	 * 广度遍历
	 */
	public void BFS(int vex) {
		VexNode start = vexsarray[getPosition(vex)];
		LinkedList<VexNode> queue = new  LinkedList<>();
		start.setVisted(true);
		queue.add(start);
		System.out.println(start.data);
		VexNode currVex;
		while (!queue.isEmpty()) {
			currVex=queue.remove(0);
			EdgeNode node = currVex.firstEdge;
			while (node!=null) {
				if (vexsarray[node.adjvex].isVisted==false) {
					System.out.println(vexsarray[node.adjvex].data);
					vexsarray[node.adjvex].setVisted(true);
					queue.add(vexsarray[node.adjvex]);
				}
				node=node.nextEdge;
			}
		}
		
		
		
	}
	
}

测试类:

package graph1;

import javax.swing.text.GapContent;

public class Test {

	public static void main(String[] args) {
		
		int[] vexs = {0,1,2,3,4};
		int[][] edges = {
				{0,1},
				{0,3},
				{1,0},
				{1,2},
				{2,1},
				{2,3},
				{2,4},
				{3,0},
				{3,2},
				{3,4},
				{4,2},
				{4,3},
				
		};
		Graph graph = new Graph();
		graph.buildGraph(vexs, edges);
		graph.printGraph();
		graph.DFS(0);
		System.out.println("--------");

		graph.BFS(0);
	}

}
java使用邻接表对图进行深度和广度优先遍历 本程序通过java使用邻接表对图进行深度和广度优先遍历,其中包括图和节点的数据结构实现 立即下载

相关推荐

图的邻接表存储及遍历(JAVA)

NULL 博文链接:https://128kj.iteye.com/blog/1694918

Java实现有向图Graph, 以及深度优先遍历(DFS), 广度优先遍历(BFS)

有向图的实现(Directed Graph) 有向图的实现有两种,一种是用矩阵(Matrix)的形式来实现,另一种是用链表(List)的形式来实现。 如果我们使用矩阵来实现有向图,来看一个例子: 每行代表相应的顶点,如果M[i][j] = 1,那么就代表顶点 i 连向 j,如果是0,则表达顶点间没有联系。用矩阵的方式来实现图的优势很明显,我们可以很快地判断两个顶点之间是否相连,可是用矩阵实现的时间复杂度很高,我们需要O(V^2)来记录所有的数据,不管顶点之间是否有相连线。为了解决时间复杂度的问题,我们可以

weixin_41596800的博客 3556

320x240 TFT屏的SPI DMA驱动避坑指南:基于HC32F460的时序调试心得

本文详细介绍了基于HC32F460 MCU驱动320x240 TFT屏的SPI DMA实战经验,涵盖硬件设计、波形诊断、DMA优化及高级调试技巧。重点解析SPI时序配置、DMA缓冲区对齐等常见问题,并提供逻辑分析仪波形诊断方法和性能优化策略,帮助开发者规避典型陷阱,提升显示性能。

weixin_42639246的博客 373

java有向图遍历算法_有向图的深度优先遍历算法的快速实现及应用

本文介绍使用java.util.*包中的HashMap 和 LinkedList 以及 ArrayList类快速实现一个有向图,并实现有向图的深度优先遍历算法。如何构造图?本文根据字符串数组来构造一个图。图的顶点标识用字符串来表示,如果某个字符串A的第一个字符与另一个字符串B的最后一个字符相同,则它们之间构造一条有向边。比如,字符串数组{”hap”,”peg”,”pmg”,”god”}对应的有向图...

weixin_33940733的博客 1517

AI安全攻防:十六进制编码与表情符号如何绕过ChatGPT安全限制

在人工智能安全领域,提示词工程是影响大语言模型行为的关键技术。其核心原理在于通过精心设计的输入文本,引导模型生成特定内容或执行特定任务。这项技术的价值在于能够深入探究模型的理解机制与决策边界,对于模型优化、安全测试及功能开发具有重要意义。在实际应用场景中,研究人员常利用编码转换、符号插入等方法构造输入,以测试模型安全护栏的鲁棒性。近期,一种结合十六进制编码与表情符号的组合攻击手法受到关注,该方法通过信息伪装与语义干扰,试图绕过模型内置的内容过滤机制,这凸显了当前AI安全在输入预处理与语义理解协同防御上面临的

weixin_30633405的博客 451

Amber分子动力学模拟:蛋白结构准备全流程与关键注意事项

分子动力学模拟是研究蛋白结构、配体结合与构象变化的重要计算手段,其结果的可靠性高度依赖初始结构的质量。在Amber模拟体系中,结构准备是决定后续计算成败的“一票否决”环节,任何缺失残基、错误质子化状态或未处理的二硫键都可能让长时程模拟失去意义。从PDB原始文件出发,需依次完成结构检查与清洗、残基命名统一、配体参数化、金属离子建模、加氢及质子化状态判断,最后通过tleap构建力场、溶剂盒子与离子环境。这一过程看似琐碎,却直接决定了蛋白在模拟中的物理合理性。无论是解析催化机制、评估药物结合亲和力,还是探索构象变

weixin_31714129的博客 241

java有向图的广度遍历_图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

1. 深度优先遍历深度优先遍历(Depth First Search)的主要思想是:1、首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;2、当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。在此我想用一句话来形容 “不到南墙不回头”。1.1 无向图的深度优先遍历图解以下"无向图"为例:对上无向图进行深度优先遍历,从A开始:第1步:访问A...

weixin_36140400的博客 4105

【异常】OpenClaw LLM请求超时异常LLM request timed out.的技术分析与解决方案

LLM请求超时是OpenClaw工程化落地中最常见的链路稳定性问题,排查处置需遵循标准化的分级流程。绝大多数场景可通过重试、调整超时配置、优化模型选型快速解决;针对顽固型异常,可通过全链路日志拆解超时阶段,精准定位根因并完成针对性修复,最终保障OpenClaw业务链路的稳定运行。

奶爸的编程之路,也就一周冷个三天 1990

Java版高级数据结构算法 - 有向图的深度遍历、广度遍历、不带权值最短路径求解

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 文章目录图的顶点类型定义图的类型定义从文件中读取图的顶点和路径信息创建邻接表图的深度优先遍历DFS图的广度优先遍历BFS最短路径求解深度优先遍历、广度优先遍历,最短路径代码测试 这篇文章主要输出完整的有向图的相关代码,关于无向图和有向图的理论,很多数据结构的书籍...

大秦坑王的专栏 2151

ARFoundation系列讲解-教程目录

一、教程目录 ARFoundation快速入门-01简介 ARFoundation快速入门-02环境搭建 ARFoundation快速入门-03环境配置之iOS ARFoundation快速入门-04环境配置之Android ARFoundation快速入门-05ARKit设备支持列表 ARFoundation快速入门-06ARCore设备支持列表 ARFoundation快速入门-07检查设备支持 ARFoundation快速入门-08平面检..........

a451319296的博客 3万+

三臂杆大型液压机械臂集中式ADRC控制系统设计

本文设计了一种用于三臂杆液压机械臂的集中式自抗扰控制(ADRC)系统。该系统通过建立包含惯性矩阵、科氏力、重力及摩擦力的非线性动力学模型,并集成液压系统传递函数,构建了完整的系统模型。控制方案采用跟踪微分器安排过渡过程,扩张状态观测器实时估计系统状态和总扰动,以及非线性状态误差反馈生成控制量。MATLAB实现展示了集中式ADRC控制器的核心结构,包括参数定义、跟踪微分器、扩张状态观测器和非线性反馈模块的设计。该系统能有效处理多关节耦合效应,实现三输入三输出的MIMO控制,具有抗干扰能力强、响应速度快的特点。

huanghm88的专栏 271

邻接表表示图Java完整代码实现与经典应用(深度/广度优先遍历、Dijkstra最短路径)【数据结构】

使用Java语言完整实现邻接表表示图与经典应用,如深度/广度优先遍历、Dijkstra最短路径问题

小賀のBlog 735

Python爬虫实战:使用Scrapy+Playwright高效爬取全球石油价格历史数据

python复制下载# 产品信息# 日期信息# 价格数据price = scrapy.Field() # 收盘价open = scrapy.Field() # 开盘价high = scrapy.Field() # 最高价low = scrapy.Field() # 最低价volume = scrapy.Field() # 交易量change_percent = scrapy.Field() # 涨跌幅# 元数据。

2201_76125261的博客 1020

分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构–图(深度优先遍历和广度优先遍历)(Java)...

数据结构–图(深度优先遍历和广度优先遍历)(Java) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 图的常用概念 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。 顶点(vertex) 边(edge) 路径 无向图 有向图 带权图 图的表示方式 图的表...

weixin_39823459的博客 2145

嵌入式开发环境Vscode开发STM32单片机程序

STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc +开发单片机程序的经验。(这里不解释 gcc 是什么)。

嵌入式技术开发 1845

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_Java数据结构——图的深度和广度优先遍历(递归和非递归都有,邻接表和邻接矩阵)...

图论是一个很重要的工具,这节主要是图的创建和遍历的Java代码,不讲理论,只撸代码,理论网上很多,具体一步步该怎么走,其他的贴子也都给全了,但是都是c语言,我们用Java实现和模拟图论。内容有点多,给个目录:目录:1. 图结点的创建2. 图的创建 2.1 图的结构和初始化 2.2 邻接矩阵 2.3 邻接表3. 邻接表的两种遍历 3.1 深...

weixin_39661353的博客 1432

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java实现邻接表存储图并实现深度优先遍历算法和广度优先遍历算法

Java实现邻接表存储图并实现深度优先算法和广度优先算法 1、结点类: 成员说明: ① edgeNodeList:与该结点相连的结点 ②name:该结点名字 ③isVisited:是否被访问过,默认是否 public class EdgeNode { //该结点所连接的其他结点 private LinkedList<EdgeNode> edgeNodeList; //结点名称 private String name; //初始阶段结点未被访问 p

mymic的博客 2099

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

树与图的深度和广度优先遍历-java实现邻接表存储

和邻接表(存储每个点直接到达的所有点,h[N]存储每个位置头结点,每次加入边都在头结点加入)两种表达方式。找出每个点去掉后,它的剩余联通块的点数的最大值,然后遍历得到其中最大值的最小值是多少。每次当前节点保存该节点的子树的点的数量,对于每个节点,父节点那一坨。图分成有向图和无向图(a-b 建a->b和b->a)最短路径都参考bfs写法,队列引入更新距离矩阵d。有向图可以用邻接矩阵(树是特殊的无环连通图。

m0_52695557的博客 477

深度搜索和广度搜索领接表实现_Java数据结构——图的深度和广度优先遍历(递归和非递归都有,邻接表和邻接矩阵)...

图论是一个很重要的工具,这节主要是图的创建和遍历的Java代码,不讲理论,只撸代码,理论网上很多,具体一步步该怎么走,其他的贴子也都给全了,但是都是c语言,我们用Java实现和模拟图论。内容有点多,给个目录:目录:1. 图结点的创建2. 图的创建2.1 图的结构和初始化2.2 邻接矩阵2.3 邻接表3. 邻接表的两种遍历3.1 深度优先遍历(邻接表)3.1.1 递归算法(邻接表)3.1.2 ...

weixin_39880895的博客 255

深度遍历 java_java 图论一 深度遍历和广度遍历

图对建模很有帮助。图的基本知识:Java实现图的两种方法1邻接矩阵邻接矩阵是用二维数据,使用1代表节点间有边,如下表格:ABCDA0111B1001C1000D11002邻接表临界表是使用类似链表,连接节点,表示有边定点包含邻接顶点的链表AB->C->DBA->DCADA->B深度遍历思路:使用栈,查找栈顶顶点连通到的,没有访问的顶点,使其入栈,并访问。当找不到,则当前栈顶...

weixin_27252001的博客 157

Java实现图的遍历

最近又在手撕数据结构的代码,温习一遍得到了一些新的感悟。在这里全面地总结一下关于图的遍历算法逻辑,并手写Java代码实现,力图将全部实现逻辑呈现在读者面前。本文主要讲解的图的遍历算法为深度优先遍历与广度优先遍历。 一、图的实现 图的实现主要有两种方式,一种是邻接矩阵,一种是邻接表。 所谓邻接矩阵就是构建一个节点到节点的矩阵,每一行每一列都代表一个节点,矩阵的输入数据即为该位置所在的行和列对应的节点之间是否可达。一般而言,若该数值为表示不可达,为一个正数表示该条边的权值。矩阵对角线上的数值一般为0,表示

wwb44444的博客 2598

Java构建图和图的深度优先遍历(dfs)和广度优先遍历(bfs)

13.1 图基本介绍 13.1.1 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图 13.1.2 图的举例说明 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图: 13.1.3 图的常用概念 顶点(vertex) 边(edge) 路径 无向图(下图) 有向图 带权图 13.2 图的表示方式 图的表示方式有两种:

当一个合格的软件工程师 2968

图论算法—图(Graph)的入门概念、存储结构、遍历方式以及Java代码的实现

介绍了图的入门概念,图的邻接矩阵和邻接表两种存储结构、以及深度优先遍历和广度优先遍历的两种遍历方式,最后提供了4种Java代码的实现。

终生学习践行者 6695

基于邻接表的无向图的深度广度遍历实现

邻接表,无向图,深度、广度遍历,测试通过 基本构建图的邻接表结构以及深度广度遍历 public class ALGraph { AdjList[] vertices; int vexNum; int arcNum; boolean[] visited; public ALGraph(int vexNum,int arcNum){ this.vexNum = vexNum;

哆啦咪~fo 2137

利用栈和队列实现图的深度优先遍历与广度优先遍历

利用栈和队列实现图的深度优先遍历与广度优先遍历 结果: 深度优先遍历 [A, F, G, E, H, D, I, C, B] 广度优先遍历 [A, B, F, C, G, I, E, D, H] import java.util.*; public class Test3 { // 深度 public void DFS(HashMap<String, String> map, String startNode) { // 定义一个访问数组,判断当前节点是否访问过 A

ssmbyss的博客 4584

图的创建,图的深度优先遍历和广度优先遍历

图

Dichotomy_的博客 755
上一篇: Java实现基于邻接表的图的建立
下一篇: Java NIO实现简单聊天室(GUI版)
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值