LeetCode 网络延迟时间 - Dijkstra 算法

2024-04-14 03:36

本文主要是介绍LeetCode 网络延迟时间 - Dijkstra 算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网络延迟时间- Dijkstra的算法

function networkDelayTime(times: number[][], n: number, k: number): number {const adjList:Record<string, [number,number, number][]> = {};for(let i = 0; i < times.length; i++) {if(!adjList[times[i][0]]){adjList[times[i][0]] = [[times[i][0], times[i][1], times[i][2]]];}else {adjList[times[i][0]].push([times[i][0], times[i][1], times[i][2]]);}}const minTimes = Array(n+1).fill(Infinity);minTimes[k] = 0;const minHeap = new MinHeap();const edges = adjList[String(k)];if(!edges) return -1;for(let i = 0; i < edges.length; i++)minHeap.add(edges[i]); while(!minHeap.isEmpty()){const [source, target, time] = minHeap.pop();if(minTimes[target] > minTimes[source] + time) {minTimes[target] = minTimes[source] + time;const edges = adjList[target];if(!edges) continue;for(let i = 0; i< edges.length; i++) {minHeap.add(edges[i]);}}}let max = 0;for(let i = 1; i < minTimes.length; i++) {if(minTimes[i] === Infinity)return -1;else if(max < minTimes[i])max = minTimes[i];}return max;
};class MinHeap {private arr:[number,number,number][] = [];isEmpty():boolean {return this.arr.length === 0;}add(e:[number,number,number]){this.arr.push(e);let curI = this.arr.length - 1, parentI = this.getParentI(curI);while(curI > 0 && this.arr[curI][2] < this.arr[parentI][2]){this.swap(curI, parentI);curI = parentI;parentI =  this.getParentI(curI);}}pop():[number,number,number]{const retE = this.arr[0];const last = this.arr.pop();if(this.arr.length === 0) return retE;this.arr[0] = last;let curI = 0, leftChildI = this.getLeftChildI(curI), rightChildI = this.getRightChildI(curI);while((leftChildI < this.arr.length && this.arr[leftChildI][2] < this.arr[curI][2])|| (rightChildI < this.arr.length && this.arr[rightChildI][2] < this.arr[curI][2])) {const smallerChildI = (rightChildI >= this.arr.length || this.arr[rightChildI][2] > this.arr[leftChildI][2])? leftChildI : rightChildI;this.swap(smallerChildI, curI);curI = smallerChildI;leftChildI  = this.getLeftChildI(curI);rightChildI = this.getRightChildI(curI);}return retE;}private swap(i:number, j:number) {const temp = this.arr[i];this.arr[i] = this.arr[j];this.arr[j] = temp;}private getParentI(i:number) {return Math.floor((i - 1)/2);}private getLeftChildI(i:number) {return 2*i + 1;}private getRightChildI(i:number) {return 2*i + 2;}
}

Dijkstra的算法通过迭代更新到每个节点的最短路径来起作用。从源节点开始,它考虑了所有传出边缘,并将最短的边缘添加到路径中。考虑到所有外向的边缘,每个新添加的节点都重复此过程。如果发现较短的路径到节点,则该算法会更新路径长度。这一直持续到所有节点都被考虑为止。

这是实施的概述:

  1. 初始化 minTimes 数组存储到达每个节点的最短时间,将所有元素设置为 Infinity ,除了设置为源节点 0
  2. 将所有源自源节点的边缘推入一个分钟-堆。
  3. 弹出最短的边缘-堆并考虑其目标节点。如果通过此边缘到目标节点的路径比当前路径短,请更新时间 minTimes 并将所有源自目标节点的边缘添加到最小值-堆。
  4. 重复步骤3直到最小-堆是空的。
  5. 迭代 minTimes 数组以找到最大值。如果保留任何元素 Infinity ,这表明相应的节点是无法到达的,所以返回-1。
  6. 返回最大值,表示达到最远节点所需的时间。

这篇关于LeetCode 网络延迟时间 - Dijkstra 算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901980

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为