LeetCode刷题--- Dijkstra 求最短路径

首先是图的表示,邻接矩阵和邻接表。实现看代码

  • 邻接矩阵:二维数组,
    • matrix[a][b] 表示 从a可以指向b
    • 无向图而言, matrix[a][b]=matrix[b][a],比如可以定义matrix[a][b]=1表示ab是连接的,matrix[a][b]=0表示ab是不可连接的
    • 有向图:matrix[a][b]=x,表示从a到b的权是x,如果matrix[a][b]=无穷大,表示ab是不可连接的
  • 邻接表:
    • 外层是一个数组,数组长度表示图中有多少个节点,数组下标对应节点a
    • 每个数组中,存放一个链表,链表的每个节点也是数组
      • 链表长度代表从a可以直接指向多少个节点
      • 链表元素树一个数组,数组第一个元素代表被执向的b,第二个元素代表a到b的权

个人感觉,邻接矩阵适合无向图,邻接表适合有向图。

/*** 邻接矩阵** @param n 初始化图中节点的个数* @param edges edges边,从edge[0]指向edge[1],路径长度为edge[2]* @return matrix*/
public int[][] adjacentMatrix(int n, int[][] edges) {// 邻接矩阵就是一个二维数组,很好理解,对应坐标的值是路径长度int[][] matrix = new int[n][n];for (int[] edge : edges) {int start = edge[0];int end = edge[1];int length = edge[2];matrix[start][end] = length;}return matrix;
}public List<int[]>[] adjacentList(int n, int[][] edges) {// 邻接列表,最外层是个数组,数组元素是一个列表// 列表中存储的数据,又是一个数组// 最外层数组,坐标代表edge[0]// 数组元素是个列表,这个列表存储的东西是 edge[1],edge[2]// 每个链表有多少元素,就说明这个点指向多少个别的点List<int[]>[] list = new List[n];for (int i = 0; i < n; i++) {list[i] = new ArrayList<>();}for (int[] edge : edges) {int start = edge[0];int end = edge[1];int length = edge[2];list[start].add(new int[] {end, length});}return list;
}

 2642. 设计可以求最短路径的图类

比如我们求从0 到其他点的最短距离,定义一个数组,第0行分别是每个节点,第一行是0到其他节点的距离,初始化为正无穷大,第三行是表示是否已经是最小距离。

0123
0
TFFF

 首先遍历0能够直接到达的顶点,修改如下,此时0到1的距离是最短的,可以标记为T

0123
025
TTFF

然后看从2出发,能够直接到达的距离

因为从1到2的距离是2+1,小于当前的5,因此可以刷新下表,此时得到了0到2最短距离3

0123
023
TTTF

思路就是上面的思路,不断的获取距离,然后和当前的距离比较,如果比他小,就更新进去。

public class Graph {List<int[]>[] graph;public Graph(int n, int[][] edges) {graph = adjacentList(n, edges);}public List<int[]>[] adjacentList(int n, int[][] edges) {List<int[]>[] list = new List[n];for (int i = 0; i < n; i++) {list[i] = new ArrayList<>();}for (int[] edge : edges) {int start = edge[0];int end = edge[1];int length = edge[2];list[start].add(new int[] {end, length});}return list;}// 向边集中添加一条边,本题的数据保证添加这条边之前对应的两个节点之间没有有向边// 这说明添加不会产生新的节点。即邻接矩阵外层的数组长度不会改变,只会改变数组元素的链表public void addEdge(int[] edge) {int start = edge[0];int end = edge[1];int length = edge[2];graph[start].add(new int[] {end, length});}public int shortestPath(int node1, int node2) {// 如果是同一个端点,说明路径为0,直接返回即可if (node1 == node2) {return 0;}// 定义一个距离数组,用于标识从当前node1出发,到所有点的最短路径,初始化值为Integer.MAX_VALUE,表示无穷大int[] distance = new int[graph.length];Arrays.fill(distance, Integer.MAX_VALUE);// node1到自身的距离为0;distance[node1] = 0;// 参考BFS,定义一个队列Queue<int[]> queue = new LinkedList<>();// 把node1变成节点传入队列中,队列存一个长度2的数组,分别表示到这个节点,距离queue.offer(new int[] {node1, 0});while (!queue.isEmpty()) {int[] poll = queue.poll();int cur = poll[0];int cost = poll[1];// if (cur == node2) {//     return cost;// }// 从邻接列表中取出当前节点可以指向的节点list,遍历这个listList<int[]> list = graph[cur];for (int[] arr : list) {int next = arr[0];int ncost = arr[1];// 如果路径和比当前小,就更新进去if (distance[next] > cost + ncost) {distance[next] = cost + ncost;queue.offer(new int[] {next, cost + ncost});}}}return distance[node2] == Integer.MAX_VALUE ? -1 : distance[node2];}
}// 优化,如果我们定义一个优先级队列,这样每次BFS的时候,都会先遍历路径最小的节点
// 这样的话,就可以在while循环里面进行判断,如果等于目标节点,就可以直接返回了
Queue<int[]> queue = new PriorityQueue<>((a, b) -> a[1] - b[1]);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571929.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j所有关系只显示RELATION,而不显示具体的关系

当看r时&#xff0c;真正的关系在properties中的type里&#xff0c;而type为“RELATION” 造成这个的原因是&#xff1a; 在创建关系时&#xff0c;需要指定关系的类型&#xff0c;这是固定的&#xff0c;不能像属性那样从CSV文件的一个字段动态赋值。标准的Cypher查询语言不支…

如何让笔记本电脑发挥120%的性能?原来还有这种小技巧

前言 现在的笔记本电脑性能真的是越来越好了&#xff01;但笔记本的CPU终究受到功耗的限制&#xff0c;与同代的台式机CPU性能相差不是一点半点的。 小白在之前很长一段时间也是使用着Windows系统的笔记本&#xff0c;也见过不下百款笔记本。 笔记本为了轻便&#xff0c;通常…

操作系统的理解|冯·若依曼体系结构|进程的状态

操作系统的理解 冯诺伊曼体系结构为什么必须通过内存然后到cpu存储金字塔冯诺伊曼结构的改进在哪&#xff1f;我们可不可以全部用寄存器来做存储器在硬件数据流动角度学以致用&#xff1a;解释程序运行为什么要加载到内存程序没被运行之前存在哪里&#xff1f; 操作系统概念广义…

C语言从入门到实战----数据在内存中的存储

1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 有符号的整数&#xff0c;三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤…

玩转云计算:教你在Akamai Linode上构建IT架构–定义项目

时至今日&#xff0c;选择以云计算方式来运维业务&#xff0c;已经成为大部分情况下的最优选。那么如果要从零开始开发一个新应用&#xff0c;并依托云平台来设计、开发、部害和远维&#xff0c;具体该从何处下手&#xff1f;这一系列文章将介绍如何基于Akamai Linode平台实现这…

【Android】美团组件化路由框架WMRouter源码解析

前言 Android无论App开发还是SDK开发&#xff0c;都绕不开组件化&#xff0c;组件化要解决的最大的问题就是组件之间的通信&#xff0c;即路由框架。国内使用最多的两个路由框架一个是阿里的ARouter&#xff0c;另一个是美团的WMRouter。这两个路由框架功能都很强大&#xff0…

质数、约数

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 质数 在大于1的整数中&#xff0c;如果只包含1和本身这两个约数&#xff0c;就被称为质数&#xff0c;或者叫素数。 质数的判定——试除法 时间复杂度&#xff1a; bool is_prime(int x) {if (x < 2) return …

【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)

书接上文&#xff1a;创建一个项目 在经过cmakemsbuild顺利生成动态库之后&#xff0c;考虑到我一个项目可能会生成多个动态库&#xff0c;它们分散在build内的不同文件夹&#xff0c;我希望能将它们收拢到一个文件夹下&#xff0c;并将其回传到svn。 一、动态库移位—cmake实…

架构的基本要素

1.架构设计如何规划&#xff1f; 架构设计目标 Do the right thing right 做对的事情 把对的事情做正确 架构设计方法 架构立方体:应用技术 功能运行 逻辑物理 架构设计输出 可落地的架构和系统 2.架构设计模式 分而治之 迭代式设计 3.架构设计输入 需要解决的目标 功能性需求 …

欧科云链OKLink:比特币第四次减半即将到来,收好这份数据宝典

减半一直是 Web3 领域重点关注的时间节点&#xff0c;由此产生的数据变动会对整个市场与生态产生关键影响。多链浏览器 OKLink 作为专业数据分析平台&#xff0c;一直以来在官方网站提供减半数据入口&#xff0c;供用户清晰查看各类资产的减半情况。&#x1f449; www.oklink.c…

Partisia Blockchain:真正做到兼顾隐私、高性能和可拓展的公链

目前&#xff0c;包括 Secret Network、Oasis Protocol 等在内的绝大多数以隐私为特性的可编程公链&#xff0c;在兼顾隐私的同时&#xff0c;在可拓展以及性能上或多或少的有所牺牲&#xff0c;即难以对诸多实际应用场景进行支撑。这归咎于链的设计以及共识机制的不合理&#…

【MATLAB源码-第170期】基于matlab的BP神经网络股票价格预测GUI界面附带详细文档说明。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于BP神经网络的股票价格预测是一种利用人工神经网络中的反向传播&#xff08;Backpropagation&#xff0c;简称BP&#xff09;算法来预测股票市场价格变化的技术。这种方法通过模拟人脑的处理方式&#xff0c;尝试捕捉股票…