当前位置: 首页 > news >正文

图论记录之最短路迪杰斯特拉

简述思想

这个思想能用一句话来概括,精简到的极致:每次找到一个最短距离的点并更新起点到各个点的最短距离
如果要可视化的话,B站搜索Dijksra算法,有视频讲解

伪代码

写到这里,其实是想整一个动画的,这样效果更好点,但由于种种原因所以就拖一下

int dijkstr()
{dist[1] = 0;其余的点的距离全部初始化为真无穷,不要写成int的最大值迭代n次将不在s中的,且距离最近的点给ts<-t用t更新其他点的距离
}

代码

这里是Acwing的851题,下面的有注释

import java.util.*;public class Main
{private static int N =510;private static int n,m;private static int[] dist;//存放起点到每个点的最短距离private static int[][] g;//邻接矩阵private static boolean[] st;//若为true表示已经确定了起点到i点的最短距离static Scanner in = new Scanner(System.in);static int dijkstra(){Arrays.fill(dist,100001);dist[1]=0;//从起点到起点是0,这个很好理解// 迭代n次for(int i=0;i<n;i++){int t=-1;for(int j=1;j<=n;j++){/*!st[j]表明j这个点我还没有访问t==-1 表明还在初始状态,初始状态必定进入该if分支dist[j]<dist[t]我找到了一个比上一次的结果的距离更短的一个点*/if(!st[j] &&(t==-1 || dist[j]<dist[t]))t=j;}st[t]=true;//标记节点t为访问状态for(int j=1;j<=n;j++)// 1~t t->j 即先到t,再加上t到j这一段距离,也叫做最后一段距离dist[j]=Math.min(dist[j],dist[t]+g[t][j]);}// 能进入该分支,表明再迭代n次后,没有任何一个点能到达终点n,所以终点不可达,那么返回-1(题目要求的)if(dist[n]==100001)return -1;return dist[n];}public static void main(String[] args){n = in.nextInt();m = in.nextInt();g = new int[n+1][n+1];dist = new int[n+1];st=new boolean[n+1];for(int[] arr:g)//不要写成Integer.MAX_VALUE,由于dist[t]+g[t][j],这个运算操作会溢出Arrays.fill(arr,100001);while(m-->0){int x = in.nextInt();int y = in.nextInt();int z = in.nextInt();//重复边取最小g[x][y] = Math.min(g[x][y],z);}System.out.println(dijkstra());}}

堆优化

其实这个优化是对下面这个循环进行优化,这个循环是用t去更新所有从起点到j的距离,会有不需要更新的点,我们是否可以避免哪些不需要更新的操作?这就是堆干的事情了

for(int j=1;j<=n;j++)// 1~t t->j 即先到t,再加上t到j这一段距离,也叫做最后一段距离dist[j]=Math.min(dist[j],dist[t]+g[t][j]);

// 就比如说10 15,堆中弹出来的可能是之前已经确定的最短距离的点,这个时候st数组的作用就发挥出来了,直接丢掉

import java.util.*;public class Main
{private static int N =150010;private static int n,m;private static int[] dist;//存放起点到每个点的最短距离private static int[] h;//邻接表private static int[] ne = new int[N];//指针域 100010 的原因是最多右10000条边,多开10个无伤大雅,因为这样避免出现边界问题private static int[] e = new int[N];//数据域private static int[] weight = new int[N];//权值private static boolean[] st;//若为true表示已经确定了起点到i点的最短距离private static int idx =0;static Scanner in = new Scanner(System.in);static int dijkstra(){Arrays.fill(dist,1000000000);dist[1]=0;//起点离自己的距离是0PriorityQueue<int[]> pq = new PriorityQueue<>(n,(x,y)->{return x[1]-y[1];});pq.offer(new int[]{1,0});while (!pq.isEmpty()){int[] poll = pq.poll();int t = poll[0],distance = poll[1];if(st[t])continue;st[t]=true;for(int i=h[t];i!=-1;i=ne[i]){int vertex = e[i];if(dist[vertex] >distance+weight[i]){dist[vertex] = distance+weight[i];pq.offer(new int[]{vertex,dist[vertex]});}}}if(dist[n]==1000000000)return -1;return dist[n];}static void add(int x,int y,int z){e[idx]=y;ne[idx]=h[x];weight[idx]=z;h[x]=idx++;}public static void main(String[] args){n = in.nextInt();m = in.nextInt();h = new int[n+1];dist = new int[n+1];st=new boolean[n+1];Arrays.fill(dist,1000000000);Arrays.fill(h,-1);Arrays.fill(ne,-1);while(m-->0){int x = in.nextInt();int y = in.nextInt();int z = in.nextInt();add(x,y,z);}System.out.println(dijkstra());}
}

相关文章:

  • 【已修复】iPhone13 Pro 长焦相机水印(黑斑)修复 洗水印
  • 百度智能云千帆,产业创新新引擎
  • PostCSS 的详细安装和具体使用指南
  • Redis、Mysql双写情况下,如何保证数据一致
  • 【分布式】——CAPBASE理论
  • FFMPEG对于处理rtp流出现马赛克问题处理
  • [超细] npm 版本号规范升级流程
  • jvm(虚拟机)运行时数据区域介绍
  • Vue挂载全局方法
  • Docker 夺命连环 15 问
  • 【深度学习】YOLO检测器的发展历程
  • Java并发编程: 第九章 异步编程
  • 图解Kafka架构学习笔记(二)
  • 【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析
  • DC电源模块的设计与制造流程
  • 【译】JS基础算法脚本:字符串结尾
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • JavaScript的使用你知道几种?(上)
  • js ES6 求数组的交集,并集,还有差集
  • Map集合、散列表、红黑树介绍
  • node-glob通配符
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React组件设计模式(一)
  • Shell编程
  • Spring框架之我见(三)——IOC、AOP
  • Terraform入门 - 1. 安装Terraform
  • vue脚手架vue-cli
  • 包装类对象
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 如何编写一个可升级的智能合约
  • 数据结构java版之冒泡排序及优化
  • 微信小程序开发问题汇总
  • 原生Ajax
  • ​Java并发新构件之Exchanger
  • ​linux启动进程的方式
  • ​香农与信息论三大定律
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • ${factoryList }后面有空格不影响
  • (12)Hive调优——count distinct去重优化
  • (175)FPGA门控时钟技术
  • (2)STM32单片机上位机
  • (C语言)fread与fwrite详解
  • (二)换源+apt-get基础配置+搜狗拼音
  • (强烈推荐)移动端音视频从零到上手(下)
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)平衡树
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core中Emit的使用