package com.data.struct;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;
public class Dijkstra {
private Node [][]graphic;
private Node s;
private Set<Node> nextNodes=new HashSet<Node>();
public Dijkstra(int v,int e){
graphic=new Node[v][v];
for(int i=0;i<e;i++){
int v1=new Random().nextInt(v);
int v2=new Random().nextInt(v);
Node node=new Node();
node.d=Integer.MAX_VALUE-1000;
node.w=new Random().nextInt(e);
node.start=v1;
node.end=v2;
graphic[v1][v2]=node;
}
for(int i=0;i<v;i++){
if(graphic[i][i]==null){
Node node=new Node();
node.d=Integer.MAX_VALUE-1000;
node.w=new Random().nextInt(e);
node.start=i;
node.end=i;
graphic[i][i]=node;
}
}
for(int i=0;i<v;i++){
nextNodes.add(graphic[i][i]);
}
s=graphic[0][0];
s.d=0;
}
public void dijkstra(){
for(int k=0;k<graphic.length;k++){
if(k!=s.start&&graphic[s.start][k]!=null){
relex(s,graphic[k][k]);
}
}
nextNodes.remove(s);
while(nextNodes.size()>0){
Node node=extractMin();
for(int k=0;k<graphic.length;k++){
if(k!=node.start&&graphic[node.start][k]!=null){
relex(node,graphic[k][k]);
}
}
nextNodes.remove(node);
}
}
public Node extractMin() {
Iterator<Node> it = nextNodes.iterator();
Node node=null;
while(it.hasNext()){
if(node==null){
node=it.next();
}else{
Node n=it.next();
if(n.d<node.d){
node=n;
}
}
}
return node;
}
public void relex(Node u,Node v){
if(graphic[v.end][v.end].d>u.d+graphic[u.start][v.start].w){
graphic[v.end][v.end].d=u.d+graphic[u.start][v.start].w;
graphic[v.end][v.end].parent=u;
System.out.println(graphic[v.end][v.end].start+"=>"+u.start);
}
}
public void print(){
for(int i=0;i<graphic.length;i++){
for(int j=0;j<graphic[i].length;j++){
if(graphic[i][j]==null){
System.out.print(-1+"|"+-1+"|"+-1+" ");
}else{
System.out.print(graphic[i][j].start+"|"+graphic[i][j].end+"|"+graphic[i][j].w+" ");
}
}
System.out.println();
}
}
public void printPath(){
List<Integer> indexList=new ArrayList<Integer>();
List<Integer> removeList=new ArrayList<Integer>();
List<Integer> addList=new ArrayList<Integer>();
indexList.add(0);
while(indexList.size()>0){
removeList.clear();
addList.clear();
for(int x=0;x<indexList.size();x++){
int l=indexList.get(x);
removeList.add(l);
for(int j=0;j<graphic.length;j++){
if(graphic[j][j].parent==graphic[l][l]){
graphic[l][l].children.add(graphic[j][j]);
addList.add(j);
}
}
}
indexList.removeAll(removeList);
indexList.addAll(addList);
}
Node h = this.s;
this.print(0, h,h);
System.out.println();
}
private void print(int level,Node parent, Node node){
for (int i = 0; i < level; i++) {
System.out.format(" ");
}
System.out.format("|");
if(parent!=node){
System.out.print("("+graphic[parent.start][node.end].w+")");
for (int i = 0; i < level; i++) {
System.out.format("-");
}
}else{
for (int i = 0; i < level; i++) {
System.out.format("-");
}
}
System.out.format("%d%n", node.start);
List<Node> children = node.children;
for(int i=0;i<children.size();i++){
print(level+1,node,children.get(i));
}
}
private class Node{
private int d;
private int w;
private int start;
private int end;
private Node parent;
private List<Node> children=new ArrayList<Node>();
}
public static void main(String[] args) {
Dijkstra d=new Dijkstra(5,20);
d.print();
d.dijkstra();
d.printPath();
}
}
相关推荐
【算法】单源最短路径——dijkstra算法
一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。 dijkstra算法简介 迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 需要注意的是,dij
Neo4j查询节点间最短路径
Neo4j最短路径问题 1.指定某一节点 无向边: MATCH (p1:Person {name:&amp;amp;quot;aaaaaaa&amp;amp;quot;}),(p2:Person{name:&amp;amp;quot;bbbbbb&amp;amp;quot;}), p=shortestpath((p1)-[*..10]-(p2)) RETURN p 有向边: MATCH (p1:Person {name:&
单源最短路径问题Dijkstra算法的c语言实现
求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值是依照图赋的,邻接节点赋对应边的权值,其他节点赋无穷大)。在Dijkstra算法的每一个阶段,将未处理的节点放入一个集合S,扫描S中距离最小的一个节点v,将v置为处理状态。然后在剩下的所...
neo4j路径发现算法(Path finding algorithms)-6.The Yen’s K-shortest paths algorithm
一.介绍: k条最短路径算法(KSP):通常情况下,最短路径问题分为:单源最短路径和所有顶点对之间的最短路径,但两个都有一个问题,两种都只考虑两点之间最短的那一条路径,不考虑次短,再次短等路径。 KSP问题是对最短路径问题的推广,它除了要确定最短路径之外,还要确定次短路径、第三短路径,…,知道找到第K短路径。用Pi表示从起点s到终点t的第i短路径,KSP问题是确定路径集合Pk={p1,p2...
Dijkstra算法|单源最短路径|贪心算法
单愿最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称之为源(origin)。现在要计算从源到其他各顶点的最短路径的长度。这里的路径长度指的是到达路径各边权值之和。 Dijkstra算法是解单源最短路径问题的贪心算法。Dijkstra算法的基本思想是:设置顶点集合S并不断地做贪心选择来扩充集合。一个顶点属于集合S当且仅当从源点到该顶点
Dijkstra算法一种用于求解单源最短路径问题的经典算法
Dijkstra算法是解决单源最短路径问题的经典算法,由Edsger W. Dijkstra于1956年提出。它采用贪心策略,逐步扩展已知最短路径集合,适用于非负权重的加权图。算法通过初始化距离数组、优先队列和已处理顶点集合,迭代更新邻接顶点的最短距离。时间复杂度取决于优先队列的实现方式:从O(V²)到O(E+VlogV)。需要注意的是,该算法不能处理负权边。示例展示了从源点A到其他顶点的最短路径计算过程,并附有Python实现代码,使用优先队列优化效率。
所有节点对的最短路径
package com.data.struct; import java.util.Random; public class AllPairsShortestPath { private Node [][]graphic; public AllPairsShortestPath(int v,int e){ graphic=new Node[v][v]; for(int i=0;i<
算法——单源最短路径:Bellman-Ford算法、Dijkstra算法
前言 在最短路径问题中,约定
Spark组件之GraphX学习9--使用pregel函数求单源最短路径
更多代码请见:https://github.com/xubo245/SparkLearning 1解释 使用pregel函数求单源最短路径 GraphX中的单源点最短路径例子,使用的是类Pregel的方式。 核心部分是三个函数: 1.节点处理消息的函数 vprog: (VertexId, VD, A) => VD (节点id,节点属性,消息) => 节点属性 2.
打穿内网之Vulntarget-a靶场实战记录
内容包括:通达OA未授权上传+文件包含RCE、Redis未授权写马、ms17-010永恒之蓝、代理转发内网跳板、CVE-2020-1472 域控杀器Zerologon、wmiexec/smbexec横向移动、cobalt strike与msf的shell传递
无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误怎么解决
本文的内容是无法找到 Adobe PDF资源文件。“Acrobat PDFMaker“您必须具有”管理员”权限方可安装这些文件...错误的解决办法。
neo4j使用cypher求多个结点两两间的最短路径
with [3105, 200025928, 200025929, 151286502, 135660351] as id_list match (v:vertices) where v.id in id_list with collect(v) as nodes unwind nodes as source unwind nodes as target with source,t...
基于MOS的防反接电路
防反接电路一般用于电源入口处,在电源反接时,保证电源入口之后的电路不会受到损害。一般在电源电流较小、对1V左右的压降不敏感时可以使用二极管进行防反接。防反接的形式有直接在正极串联二极管(如图1),或使用整流桥的方式(如图2),但这两种方式均存在:1、存在二极管的管压降;2、过大电流时,二极管消耗的功率大,发热严重。这两个问题。 图 1 二极管防反接电路 图 2 整流管防反接电路 1、基于NMO...
Dijkstra 算法求单源最短路径—— Java 实现
package com.algorithm.greed; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; /** * @author zhoushixiong * @Description Dijkstra 算法求单源最短路径 * @date 2020/11/18 8:58 **/ public c.
51单片机定时器的原理、应用与编程实现
本文系统介绍了51单片机定时器的基本原理与应用。首先阐述了定时器的工作原理,包括定时模式和计数模式的区别。然后详细讲解了定时器的四种工作模式(方式0-方式3)及其适用场景,并分析了相关寄存器(TMOD、TCON、THx/TLx)的功能设置。文章还给出了定时器编程的具体步骤,包括初始化、计数初值计算和示例代码。最后通过LED闪烁、PWM波形产生、脉冲计数等实际应用案例,展示了定时器的多样化应用。掌握这些知识对嵌入式系统开发具有重要意义。
TensorRT(C++)部署 Pytorch模型
众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。
dijkstra复杂度_Dijkstra算法详细(单源最短路径算法)
介绍对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它。Dijkstra能是干啥的?Dijkstra是用来求单源最短路径的就拿上图来说,假如直到的路径和长度已知,那么可以使用 dijkstra ...
保姆级教程:用HFSS 2023 R2搞定GPS右旋圆极化微带天线(从建模到优化全流程)
本文提供了一份详细的HFSS 2023 R2教程,指导读者从零开始设计GPS右旋圆极化微带天线。涵盖建模、仿真和优化全流程,特别关注圆极化特性的实现与优化,帮助工程师快速掌握天线设计的关键技术。
【算法】Dijkstra 算法:解决单源最短路径问题
Dijkstra 算法Dijkstra算法,中文名音译作迪杰斯特拉算法或戴克斯特拉算法,它是一个用来解决赋权图的单源最短路径问题的算法。之所以这个算法名这么不好读也不好记,是因为 Dij...
零中频架构实战:用Matlab模拟AD9361收发信号(附完整代码)
本文详细介绍了如何使用Matlab模拟AD9361射频收发器的零中频架构,解决镜像干扰等关键挑战。通过完整的代码示例和系统级建模方法,帮助工程师掌握RFIC设计中的自适应校准算法和性能优化技巧,特别适用于SDR系统开发。
手把手教你学基带SOC芯片(4.4.9)--基带芯片的电源管理实例:高通 Snapdragon 系列实例(十)
Snapdragon 888 通过支持多种深度睡眠模式,如 AOAC 模式、低功耗模式和深度睡眠模式,以及智能电源管理技术,实现了对功耗的精细管理。这些模式不仅延长了设备的电池寿命,还确保了用户在各种使用场景下的良好体验。无论是保持网络连接、限制后台活动,还是完全关闭不必要的功能,Snapdragon 888 都能够灵活应对,提供高效的功耗管理方案。
dijkstra算法_Dijkstra算法详细(单源最短路径算法)
介绍对于 dijkstra 算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解 bfs和dfs ,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或许,你曾经感觉它很难,那么,这个时候正适合你重新认识它。Dijkstra能是干啥的?Dijkstra是用来求单源最短路径的就拿上图来说,假如直到的路径和长度已知,那么可以使用 dijkstra ...
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
Dijkstra算法详细(单源最短路径算法)
我们大部分人可能比较了解BFS 和 DFS,对于Dijkstra算法他是图算法结构中解决单源最短路径问题的算法。 大概就是这样一个有权图,Dijkstra算法可以计算任意节点到其他节点的最短路径。(单源最短路径问题),Dijkstra算法只能求一个顶点到其他点的最短距离而不能任意两点。 首先我们先回顾一下图论的基础吧, 一幅图是由节点和边构成的,逻辑结构如下,通常我们会用邻接表或邻接矩阵来实现: ①邻接表很直观,我把每个节点 x 的邻居都存到一个列表里,然后把 x 和这个列表关联起来,这样就可以通过一
迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)
迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)
ssm框架搭建
这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载
JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法
一,概念单源最短路径给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。dijkstra算法简介迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心...
单源最短路径问题:Dijkstra算法
主要是Dijkstra算法简介,简单介绍一下贪心算法、单源最短路径问题、加权有向图、邻接列表
3万+



被折叠的 条评论
为什么被折叠?



