Java实现基于邻接表的图的几个应用

图论——图的邻接表实现——Java语言(完整demo) 一、图的实现方式概述 1、图的简单实现方法——邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法。 对于每条边(u,v),置A[u,v]等于true;否则,数组的元素就是false。如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权来标记不存在的边。虽然这样表示非常简单,但是,它的空间需求则为θ... 阅读详情

Java实现基于邻接表的图的几个应用

图建立类:

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(%d)--",node.adjvex,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 java.util.Iterator;
import java.util.LinkedList;
import java.util.Stack;

import graph.DFS;
import graph.Graph.vexNode;
import graph1.Graph.EdgeNode;
import graph1.Graph.VexNode;

public class Graph_App {
	int[] index = new int[20];
	LinkedList<VexNode> path = new LinkedList<>();
	LinkedList<VexNode> path2 = new LinkedList<>();
	boolean[] vis = new boolean[15];
//	int d = -1;
	/*
	 * 判断是否为连通图
	 */
	public boolean connect(Graph graph) {
		boolean flag=true;
		graph.DFS(0);
		for(int i=0;i<graph.vexsarray.length;i++) {
			if (!graph.vexsarray[i].isVisted) {
						flag=flag;
						break;
			}
		}
		return flag;
	}
	
	/*
	 * 判断顶点v1到v2之间是否有路径
	 */
	public boolean HasaPath(Graph graph,VexNode vexNode1,VexNode vexNode2) {
				EdgeNode node = vexNode1.firstEdge;
				int i=0;
				boolean flag=false;
				while (node!=null) {
					
					index[i] = graph.vexsarray[node.adjvex].data;
					i++;
					node=node.nextEdge;
				}
				
				for(int j=0;j<index.length;j++) {
					if (index[j]==vexNode2.data) {
						flag=true;
					}
					
				}
				return flag;
	}
	
	
	/*
	 * 找到顶点v1到v2之间的路径
	 */
	public void FindPath(Graph graph,VexNode vexNode1,VexNode vexNode2) {
			EdgeNode node = vexNode1.firstEdge;
			int w;
			VexNode vexNode ;
			vexNode1.setVisted(true);
			path.add(vexNode1);
			while (node!=null) {
				w=node.adjvex;
				if (!graph.vexsarray[w].isVisted) {
				
					FindPath(graph, graph.vexsarray[w], vexNode2);
				}
				node=node.nextEdge;
			}
		
		
	}
	
	

	
}

测试类:

package graph1;

import java.util.Iterator;

import graph1.Graph.VexNode;

public class Tset2 {

	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_App app = new Graph_App();
		System.out.println(app.connect(graph));
		System.out.println(app.HasaPath(graph, graph.vexsarray[0],graph.vexsarray[3]));
		app.FindPath(graph, graph.vexsarray[0],graph.vexsarray[4]);
		Iterator<VexNode> iterator = app.path.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next().data);
		}
		
		
	}

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

相关推荐

图 - Java实现有向带权图的邻接表表示法

图 - Java实现有向带权图的邻接表表示法

云梦归遥【qq_45834685】 5334

Java数据结构——图-邻接表

用图-邻接表实现以下功能。有类似需求的也可以参考一下。

Jay_Java_的博客 852

JAVA 在图像处理中的应用

NULL 博文链接:https://konglx.iteye.com/blog/403329

日撸 Java 三百行(36 天: 邻接表的代码实现)

这里是JAVA自学与了解的同步笔记与记录,如有问题欢迎指正说明

ALBlack的博客 2656

java实现图的邻接表存储结构的两种方式及实例应用详解

主要介绍了java实现图的邻接表存储结构的两种方式及实例应用详解,邻接表构建图是必须需要一个Graph对象,也就是图对象!该对象包含属性有:顶点数、边数以及图的顶点集合,需要的朋友可以参考下

10xGenomics官方可视化工具——Loupe Browser

Loupe Browser是⼀款10xGenomics开发的交互式桌⾯应⽤程序,⽤于探索10x单细胞数据,可以用来找出感兴趣的细胞、找出显著差异表达的基因、鉴定细胞类型、探索细胞亚类和数据共享。

weixin_47195452的博客 3365

java图的邻接表实现两种方式及实例应用分析

本篇博客来谈一谈图的邻接表实现的两种方式,首先我们明确一点“学会图的邻接表实现的关键点在于“:你所建立的图的邻接表的对象是什么!首先我们看一下《算法导论》中关于图的邻接表的定义:图G=(V,E)的邻接表表示有一个包含 |V| 个列表的数组Adj所组成,其中每个列表对应于V中的一个顶点,对于每一个u∈V,邻接表Adj[u]包含所有满足条件(u,v)∈E的顶点v,亦即,Adj[u]包含图G中所有和顶点u

【AI机器学习与知识图谱】的博客 1万+

别再乱用标签了!深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响

本文深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响,包括标签组合查询、Pack Together by Label打包策略及运行时性能优化。通过实战代码示例和性能数据对比,帮助开发者实现精细化资源加载控制与包体优化,提升项目效率。

weixin_30500105的博客 509

邻接表以及其算法应用(优化图的存储)

邻接表是什么 邻接表是一种存储图的链式存储结构,和邻接矩阵功能一样。 假设一个双向图 我们如果用邻接矩阵储存就会是这样(没有连接的我们认为权值是inf) 0 6 inf inf 4 6 0 8 inf inf inf 8 0 2 3 inf inf 2 0 inf 4 inf 3 inf 0 我们这时候会发现,邻接矩阵会浪费一些空间,也就是没有连接的边,他也会存入一个最大值 假如用邻接表储存呢? 首先邻接表由两个主要的部分组成 头节点:用来储存节点编号 表节点:用

lymww的博客 810

AI赚钱新思路 利用RPA+KIMI实现小红书全自动制作发布(详细攻略)

我已经事先准备好了文案素材,现在就利用Kimi的智能,根据我们已有的文案来创作出新的文案吧。之前我写过一篇关于【:一个戴着用百元大钞制成的简约头饰的少女,她坐在小车里,手里拿着一叠港元,整个画面洋溢着现实主义动漫风格和治愈系的温暖气息。通过这篇文章,我们已经一步步地完成了小红书治愈系文案的创作、治愈系图片的生成,以及笔记的发布,实现了整个流程的自动化。不慌不忙,快乐常在 在繁忙的日常中,给自己的心灵留一片净土,感受内心深处的平静与安宁。接下来,我将展示如何使用影刀来编写自动化脚本,以生成治愈系的图文图片。

weixin_42172073的博客 3698

三级等保网络拓扑图实战:从零搭建符合标准的医院安全架构

本文详细阐述了如何从零开始设计并搭建符合三级等保标准的医院网络安全架构。文章基于“一个中心,三重防护”的核心框架,深入解析了医院网络分区设计、安全域划分、关键安全设备选型与配置等实战要点,并提供了绘制专业网络拓扑图的技巧与等保测评准备指南,旨在帮助医院IT人员系统化地构建既合规又实用的纵深防御体系。

weixin_29326909的博客 505

邻接表存储图Java实现

使用Java实现邻接表存储的图及其操作,深度优先遍历和广度优先遍历,拓扑排序,关键路径和最短路径问题。

liangxiamoyi的博客 1万+

学Simulink——十二脉波整流电路(移相变压器)谐波抵消仿真

Y:Δ = 1:√3(若 DC 同压)— 此处同相电压故 220V(Y)=220V(Δ phase)Y(相电压=220V)、Δ(线电压=380V ⇒ 相=220V,30° 移相)可经 Lbal​=0.5mH(平衡电抗)或直接短(大 L_dc 下均流尚可)✅ 直流输出纹波频率 = 12·f_line(vs 6·f_line)直流输出 → Ldc​=50mH→Cdc​=2200µF→R=30Ω。Line‑Line RMS = 380 V(⇒ 相=220V)Vdc​≈1.35⋅380≈513V(同 6‑脉波)

xiaoheshang_123的博客 60

java使用邻接表实现图

邻接表实现图 图的表示方式有两种: 邻接矩阵(Adjacency Matrix) 邻接表(Adjacency List) 本文采用类似邻接表的方式实现图。 图的基础接口 public interface Graph<V, E> { int verticesSize(); // 顶点数量 int edgesSize(); // 边的数量 void addVertex(V v); // 添加顶点 void addEdge(V from, V to); //

morris 1万+

树冠体积计算之体元累加法

因为是自己之前研究的一个方向,就复现了一下论文中的这个方法,在此正好记录一下。 文章目录一、简介二、代码实现(MATLAB)三、小结 一、简介 简而言之,其实就是一句话,即以固定大小的体元模拟不规则的树冠形状。按照论文中的思路主要就是将树冠沿树高方向以 k 为步长进行等距离分段,把每一段树冠的点投影到垂直于树高方向的平面上,再对该平面划分成大小为 k × k 的像元,根据投影到各个像元内点的数量,判断该像元的有效性,统计有效像元的数量 T,则树冠体积为 T 个 k × k × k 的体元之和。如下图所示:

dayuhaitang1的博客 2609

芒果YOLOv10改进31:特征融合Neck篇:改进特征融合网络 BiFPN 结构,融合更多有效特征

YOLOv10改进:特征融合Neck篇:改进特征融合网络 BiFPN 结构,融合更多有效特征

包括YOLOv5、YOLOv7、YOLOv8等模型改进 685

java数据结构之图(邻接矩阵和邻接表)

JAVA数据结构之图 1、图的介绍和原理 1.1、图的基本概念 图是由顶点集(VertexSet)和边集(EdgeSet)组成,针对图G,顶点集和边集分别记为V(G)和E(G)。依据图的边集是否为有向,可把图分为有向图和无向图,根据图是否有权重,可以分为有权图和无权图。 图的基本术语: 1:邻接点----在一个无向图中,若存在一条边(Vi,Vj),则称Vi,Vj为此边的两个端点,并称它们

xxniuren的专栏 2万+

08 RK3568 MAC TO MAC直连 RTL8367S mdio

本文:采用rk3568 gamc0 通过rgmii直连 交换芯片的mac口 通信方法为mdio。

qq_39451352的博客 3477

图的邻接表的链表实现

图的邻接表的实现 正确定义图结点 掌握图的邻接表表示法 根据图的邻接表输出邻接点 利用邻接表求各点的度 这里使用链表连接各个结点构造图的邻接表;很多术语可能不对,多多包涵; public class VertexGraphTest { public static void main(String[] args) { String str = "abcdef"; int n = str.l...

qq_43061473的博客 2093

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用邻接表来表示图

1. 图的表示有几种方法: 一是使用邻接矩阵(其实就是二维数组)表示,二是使用邻接表来表示 ,三是使用边集来表示 下面使用邻接表来表示 2. 首先定义一个图的节点,其中包含几个属性,包含图节点的值,邻居节点,当前节点是否被访问的标志,还有就是对于属性相应的的操作,包括增加邻居节点,获取邻居节点,获取当前节点的邻居节点的个数 import java.util.ArrayList; imp...

二哈 2505

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

图 邻接表 java_java实现图的邻接表存储结构的两种方式及实例应用详解

前言本篇来谈一谈图的邻接表实现的两种方式,首先我们明确一点“学会图的邻接表实现的关键点在于“:你所建立的图的邻接表的对象是什么!首先我们看一下《算法导论》中关于图的邻接表的定义:图G=(V,E)的邻接表表示有一个包含 |V| 个列表的数组Adj所组成,其中每个列表对应于V中的一个顶点,对于每一个u∈V,邻接表Adj[u]包含所有满足条件(u,v)∈E的顶点v,亦即,Adj[u]包含图G中所有和顶点...

weixin_31734677的博客 628

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java 图的邻接表_JAVA实现图的邻接表以及DFS

一:定义邻接表结构储存图package 图的遍历;//邻接表实现图的建立//储存边class EdgeNode {int index; // 习惯了用index,其实标准写法是(adjVertex)int value; // 权值EdgeNode nextArc; // 指向下一条弧}// 邻接表节点的类型class VertexNode {String name;EdgeNode firstAr...

weixin_39664431的博客 296

C++实现的邻接表

1. 在学习图的存储方式中,邻接矩阵和邻接表是两种比较常用的存储图的方式,下面使用的是C语言实现的邻接表 2. 具体的实现过程如下: ① 首先使用结构体声明图的结构体,图中顶点的结构体,以及指向下一条边的结构体,这些可以参照严蔚敏版的数据结构来写出具体的数据结构: typedef struct ArcNode{ int adjvex;//该边所指向的节点的位置 struct ArcN...

二哈 9855

用邻接表存储图

邻接表是图的一种链式存储方法,其数据结构包括两部分:节点和邻接点。用邻接表可以表示无向图,有向图和网。在此用无向图进行说明。包括节点信息 data 和指向第 1 个邻接点的指针 first。包括该邻接点的存储下标 v 和指向下一个邻接点的指针 next,如果是网的邻接点,则还需增加一个权值域 w,如下图所示。1 输入节点数和边数。2 依次输入节点信息,将其存储到节点数组 Vex[] 的 data 域中,将 Vex[] first 域置空。3 依次输入每条边依附的两个节点,如果是网,则还需要输入该边的权值。

实践求真知 4174

Java实现邻接表

package GraphBase; import java.util.*; public class ljtable { static int n, m; // 顶点数n,边数m static ArrayList<edge>[] G = new ArrayList[100005]; // 图G的邻接表 static class edge { // 边的终点编号v,边权...

weixin_43960370的博客 1521

Java实现图的遍历

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

wwb44444的博客 2598
上一篇: Java NIO实现简单聊天室(GUI版)
下一篇: Java找出图中两点之间所有路径
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值