Java找出无权无向图的最短路径

Java找出图中两点之间所有路径 Java找出图中两点之间所有路径 本实例图基于邻接表 图类: package graph1; import java.util.LinkedList; import graph.Graph.edgeNode; public class Graph { class EdgeNode{ int adjvex; EdgeNode nextEdge; } cla 阅读详情

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.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Stack;

import javax.swing.plaf.synth.SynthStyle;

import graph1.Graph.EdgeNode;

public class FindALlPath {
	
	LinkedList<Integer> linkedList = new LinkedList<>();//储存最短路径节点
	//代表某节点是否在stack中,避免产生回路  
	public Map<Integer,Boolean> states=new HashMap();  
	  
	//存放放入stack中的节点  
	public Stack<Integer> stack=new Stack();  
	boolean flag=true;//标识是否为第一条路径
	//打印stack中信息,即路径信息  
	 public void printPath(){ 
		 if (flag) {
			  for(Integer i :stack){  
			   	 	linkedList.add(i);
			    }
			  flag=false;
		}
		 if (linkedList.size()<stack.size()) {
				return ;
			}
		 linkedList.clear();
	    StringBuilder sb=new StringBuilder();  
	    for(Integer i :stack){  
	   	 	linkedList.add(i);
	    }  

	}  
	 
	//得到x的邻接点为y的后一个邻接点位置,为-1说明没有找到  
	 public int getNextNode(Graph graph,int x,int y){  
	     int next_node=-1;  
	     EdgeNode edge=graph.vexsarray[x].firstEdge;  
	     if(null!=edge&&y==-1){  
	         int n=edge.adjvex;  
	         //元素还不在stack中  
	         if(!states.get(n))  
	             return n;  
	         return -1;  
	     }  
	           
	     while(null!=edge){  
	         //节点未访问  
	         if(edge.adjvex==y){  
	             if(null!=edge.nextEdge){  
	             next_node=edge.nextEdge.adjvex;  
	             
	             if(!states.get(next_node))  
	                 return next_node;  
	             }  
	             else  
	                 return -1;  
	         }  
	         edge=edge.nextEdge;  
	     }  
	     return -1;  
	 }
	 
	 
	 
	 public void visit(Graph graph,int x,int y){  
	       //初始化所有节点在stack中的情况  
	        for(int i=0;i<graph.vexsarray.length;i++){  
	        states.put(i,false);  
	    }  
	        //stack top元素  
	        int top_node;  
	    //存放当前top元素已经访问过的邻接点,若不存在则置-1,此时代表访问该top元素的第一个邻接点  
	        int adjvex_node=-1;  
	    int next_node;  
	    stack.add(x);  
	    states.put(x,true);  
	    
	    while(!stack.isEmpty()){  
	        top_node=stack.peek();  
	        //找到需要访问的节点  
	               if(top_node==y){  
	            //打印该路径  
	            printPath();  
	            adjvex_node=stack.pop();  
	            states.put(adjvex_node,false);  
	        }  
	        else{  
	            //访问top_node的第advex_node个邻接点  
	                        next_node=getNextNode(graph,top_node,adjvex_node);  
	            if(next_node!=-1){  
	                stack.push(next_node);  
	                //置当前节点访问状态为已在stack中  
	                                states.put(next_node,true);  
	                //临接点重置  
	                                adjvex_node=-1;  
	            }  
	                       //不存在临接点,将stack top元素退出   
	                        else{  
	                //当前已经访问过了top_node的第adjvex_node邻接点  
	                                adjvex_node=stack.pop();  
	                //不在stack中  
	                states.put(adjvex_node,false);  
	            }  
	        }  
	    }  
	}  
	 
	
}
无向图的最短路径(Java) 1. 迪杰斯特拉算法求解图的最短路径 import java.util.Arrays; import static main.Common.INF; public class Dijkstra { private int[][] path; private int vertex; public Dijkstra(int nodeNum, Strin... 阅读详情

相关推荐

无向图-不带权-文件读取-最短路径算法-JAVA实现

最短路径算法(已经注释得很详细了)

qq_36645204的博客 930

Java 获取路径的所有总结方法

/** * */ /** * @author * */ package com.vcode.ticket.utils; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStre...

夕慕慕的博客 454

Java 算法:最短路径问题

最短路径问题适合于有向图与无向图: 应用: 路径规划:每个顶点就是城市,边就是道路。 工作任务:从一个点起始任务到另一个点任务完成,边就是完成任务的耗费。 例如无权图的广度优先遍历:结果就是求出了一个最短路径。 最短路径树(单源最短路径):从一个节点寻找到其他节点的最短路径。 无权图的最短路径: 遍历了1和2路径为长度为1,此时这两个点就是最短...

抛弃幻想,准备斗争 4548

java-利用Jgrapht和Dijkstra算法获取最短路径(一)

1.导入Jgrapht包 compile group: 'org.jgrapht', name: 'jgrapht-core', version: '1.3.0' 2.实际图 路径上的数值表示权重 3.代码实现 从A到C的最短路径 package com.test.dijkstra; import org.jgrapht.GraphPath; import org.jgrapht.alg.shortestpath.DijkstraShortestPath; import org.jgrapht.

qq_44742816的博客 1936

java 无向图所有最短路径算法的实现

本资源来自MyEclipse,其中的项目对其中的题目进行了解答。仅供学习参考。不足之处请批评指正。

JGrapht包简介

用java语言编写的JGrapht,适用于处理图数据结构的大多数算法,求最短路径等等算法。

数据结构与算法 - 图的BFS遍历:无权图最短路径的求解思路

文章摘要(148字): 本文深入解析广度优先搜索(BFS)在无权图最短路径求解中的应用。BFS通过队列实现逐层遍历,天然保证首次访问节点时的路径即为最短路径。文章对比了BFS与DFS的差异,通过Mermaid图表直观展示遍历过程,并提供了完整的Java代码实现,包括邻接表构建、BFS遍历、距离计算和路径重构。关键点在于BFS按层扩展特性(第n层节点距离起点n步),配合parent数组记录路径,可高效解决社交网络、路由导航等场景下的最短路径问题。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

无向图最短路径

该代码包包括了无向图的所有最短路径的求法,java实现。

java无权图求最短路径_求有权图和无权图的最短路径

无权图的最短路径思路:无权图的最短路径也就是要求两点之间最少几跳可达,那么我们可以这样,用广度遍历,从起点开始一层层遍历,如果第一次遍历到终点,那么肯定是最短路径。public static void findPath(int start,int end){//创建一个队列来存储LinkedList< VNode> queue=new LinkedList();queue.offer(...

weixin_32150955的博客 526

jgrapht-0.8.2.jar_jgraphtjar_jgrapht开发_jgrapht0.8.2下载_可视化路径_

实现可视化界面编程,功能强大,实现可视化最短路径实现

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX + CMSIS-DSP 手动添加、库添加方式

CMSIS-DSP库在工程中应用遇到的所有问题进行归纳终结

洋洋的博客 1万+

无权无向图之最少边路径

无权无向图 寻找这样的路径:从起点到终点所经过的边最少 基于广度优先算法实现 与图相关的例子大都是如下: 代码如下: package com.collonn.algorithm.grf; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; /** * 无权无向图

冰冻火山 3479

一种高超声速飞行器弹道的仿真方法

设计并实现了一个高超声速飞行器弹道仿真算法,并应用到基于OSGEarth的态势中。

eyepeak的博客 6542

最短路径 无权重无向图 java_图算法:图的表达

本节课是《进击的Java新人》的第二十一周第一课。我从第十五周到第二十周先空出来了,是准备讲多线程和并发编程的。这一部分我会加快速度,我先把后面的课程往外发一下。图算法,在实际的编程中还是会经常遇到的,最主要的就是两种图的遍历算法。举个例子,Java程序员必须掌握的垃圾回收(Garbage Collection,GC)里面,就非常依赖图算法。所以,在讨论GC之前,我们必须先把图的知识掌握了。如果有...

weixin_39908263的博客 845

OneNET物模型实战:如何用NB-IOT模块上传JSON数据并解析

本文详细介绍了如何利用NB-IOT模块将传感器数据上传至中国移动OneNET物联网平台,并利用其物模型功能实现JSON数据的自动解析。文章从理解OneNET物模型与OneJson协议入手,逐步讲解了平台侧物模型创建、设备注册,以及设备端数据构造、HEX编码与NB-IOT模块AT指令上报的全流程,并提供了关键的调试技巧与常见问题排查方法,为物联网开发者提供了完整的实战指南。

sugar的博客 681

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1386

基于无向图且权重单一的最短路径Dijkstra算法——JAVA实现

做一个无向图的权重单一的最短路径算法。 模拟停车场最近车位的选择。 首先参考了博友JavaMan_chen的博文 http://blog.youkuaiyun.com/javaman_chen/article/details/8254309 但是这个算法是有问题的。 算法中,如果A点是当前点,是选取距离A点权重最小的那一点作为下一个路径点的。 这就带来了一个问题,即

Singleton1900的专栏 5318

【PyTorch项目实战】之ResNet系列:resnet18、resnet34、resnet50、resnet101、resnet152

ResNet (Residual Network) :是一种深度卷积神经网络(CNN)架构,其核心思想是引入残差学习(Residual Learning)机制,通过跳跃连接(skip connections)来解决深层网络训练中的退化问题。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 6378

最短路径算法——无权最短路径——python3实现

本文参考来自数据结构与算法分析 java语言描述。 问题描述 现有一个无权图。如下图所示: 问题:使用某个顶点s作为输入参数,找出从s到所有其他顶点的最短路径。 说明:因为是无权图,因此我们可以为每台边赋值为1。这里选择v3为s作为起点。 问题分析 此时立刻可以说,从s到v3的最短路径是长为0的路径,标记此信息,得到下图。 现在开始寻找从s出发距离为1的顶点。这些顶点...

anlian523的博客 4462

基于Simulink的H∞鲁棒控制器设计与仿真建模示例

本文介绍了基于Simulink的H∞鲁棒控制器设计与仿真方法。针对质量-弹簧-阻尼系统存在±50%刚度不确定性的问题,详细阐述了从构建广义被控对象、设计性能加权函数,到使用hinfsyn综合控制器的完整流程。通过Simulink仿真验证,所设计的H∞控制器在参数摄动和外部扰动下均保持良好性能,位移控制误差小于2%,扰动衰减超过20dB。相比传统PID控制,H∞方法展现出显著鲁棒性优势。文章还总结了工程实践中的加权函数调参技巧、控制器降阶方法,并展望了μ-综合等扩展方向,为处理系统不确定性提供了实用解决方案。

amy_mhd的博客 70

rk3576 适配摄像头 (mipi 双摄)

RK3576 自带两个 4-Lane DPHY 和一个 DCPHY CSI 接口,可以连接 4lane 的双摄像头,最直接的方式就是充分利用其两个 D-PHY 接口。次选方案是 DCPHY + DPHY方案,更次之方案是单DPHY,设置成分离模式,连接两颗摄像头。

weixin_35723192的博客 393

图论总结-拓扑排序以及最短路径问题(无权最短路径、Dijkstra算法、具有负边值的图)

图的定义 一个图(graph)G = (V,E) 由 顶点(vertex) 集 V 和 边(edge) 集 E 组成。 每一条边就是一个点对(v,w),其中 v,w∈ V,有时也被称为弧(arc)。 如果点对是有序的,那么图就叫做是有向的(directed),有向的图有时也叫做有向图(digraph)。 顶点 v 和 w 邻接(adjacent) 当且仅当(v,w)∈ E。 有时边还有第三种成分,...

张可的博客 2241

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

Java 无权图的最短路路径算法

同时,创建一个数组(shortPath)来记录,其中shortPath[x][0]代表是否已经被访问、shortPath[x][1]代表到目标定点的最短距离、shortPath[x][2]代表当前第x个顶点的邻节点,所有都初始化为0。在无权图中,由于所有边的权重被视为一致,使得无权图的最短路径问题在算法处理上相对简化,然而,这并不意味着其缺乏实际应用的意义,实际上,它在多个领域中仍具有不可忽视的实用价值。无权图的最短路径算法:某一点到任意一点的最短路径。: 将shortPath数组返回。

Cw_Herry的博客 859

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java数据结构和算法 — 无权无向图

1、图的定义 我们知道,前面讨论的数据结构都有一个框架,而这个框架是由相应的算法实现的,比如二叉树搜索树,左子树上所有结点的值均小于它的根结点的值,右子树所有结点的值均大于它的根节点的值,类似这种形状使得它容易搜索数据和插入数据,树的边表示了从一个节点到另一个节点的快捷方式。 而图通常有个固定的形状,这是由物理或抽象的问题所决定的。比如图中节点表示城市,而边可能表示城市间的班机航线。如下图是美国加利福利亚简化的高速公路网: ①、邻接: 如果两个顶点被同一条边连接,就称这两个顶点是邻接的,如上图 I 和

weixin_53341657的博客 574

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java 点到点最短路径_【算法】求无向图中指定点到点之前最短路径

求无向图中任意两点之间最短距离在本例中,假设求1->2之间的最短距离,很容易得到f(2) = min{f(3)+1,f(5)+1}f(d) = min(f(0)>0->f(0)+1...f(d-1)>0->f(d-1)+1)JAVA编码实现public static void main(String[] args) {int[][] maps = {{0, 0, 0,...

weixin_28941895的博客 586

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: Java找出图中两点之间所有路径
下一篇: Netty初次使用
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值