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

【更新中】Leetcode中遇到的最短路径算法

dijsktra算法模板:

def dijkstra(x):#x表示出发点dis=[inf]*n #dis记录从x出发到各个点的最短距离,初始化为infdis[x]=0    #源点到自己的距离为0vis=[False]*n #检查各个点是否访问过for _ in range(n-1): #检查除了源点的其他n-1个点,更新disnode=-1 #开始假设不知道谁是离源点最近的点for j in range(n):#循环查找谁是离源点最近的那个点if not vis[j] and (node==-1 or dis[j]<dis[node]):node=jfor j in range(n):#对node的邻居点进行松弛处理dis[j]=min(dis[j],dis[node]+g[node][j])vis[node]=True #对node点标记为已访问

​​​​​​​743. 网络延迟时间
因为本题的节点是从1到n,所以最后把dis数组中的第一个忽略掉(dis[1:])

然后就是经典的dijkstra最短路径算法,套用模板即可。

class Solution:def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:g=[[inf]*(n+1) for _ in range(n+1)]for x,y,w in times:g[x][y]=wdis=[inf]*(n+1)dis[k]=0vis=[False]*(n+1)for _ in range(n):x=-1for i in range(1,n+1):if not vis[i] and (x==-1 or dis[i]<dis[x]):x=ifor i in range(1,n+1):dis[i]=min(dis[i],dis[x]+g[x][i])vis[x]=Trueans=max(dis[1:])return ans if ans!=inf else -1

2642. 设计可以求最短路径的图类
又是dijkstra最短路径算法,这里需要判断一下能否到达终点的问题:

class Graph:def __init__(self, n: int, edges: List[List[int]]):self.n=nself.g=[[float("INF")]*n for _ in range(self.n)]for x,y,cost in edges:self.g[x][y]=costdef addEdge(self, edge: List[int]) -> None:self.g[edge[0]][edge[1]]=edge[2]def shortestPath(self, node1: int, node2: int) -> int:n=len(self.g)dis=[float('INF')]*ndis[node1]=0vis=[False]*nwhile 1:x=-1for i,(b,d) in enumerate(zip(vis,dis)):if not b and (x<0 or d<dis[x]):x=iif x<0 or dis[x]==float('INF'):return -1if x==node2:return dis[x]vis[x]=Truefor y,w in enumerate(self.g[x]):if dis[x]+w<dis[y]:dis[y]=dis[x]+w# Your Graph object will be instantiated and called as such:
# obj = Graph(n, edges)
# obj.addEdge(edge)
# param_2 = obj.shortestPath(node1,node2)

1334. 阈值距离内邻居最少的城市
枚举每个点作为出发点,算法返回小于等于阈值的数目即可。

因为题目要求返回数量最少且编号最大的点,所以从n-1到0遍历即可。

class Solution:def findTheCity(self, n: int, edges: List[List[int]], distanceThreshold: int) -> int:g=[[inf]*n for _ in range(n)]for x,y,w in edges:g[x][y]=wg[y][x]=w#枚举每个点作为出发点,做dijkstra算法def dijkstra(x):dis=[inf]*ndis[x]=0vis=[False]*nfor _ in range(n-1):node=-1for j in range(n):if not vis[j] and (node==-1 or dis[j]<dis[node]):node=jfor j in range(n):dis[j]=min(dis[j],dis[node]+g[node][j])vis[node]=Truereturn sum(d<=distanceThreshold for d in dis)ans,cnt=n,inf    for i in range(n-1,-1,-1):if dijkstra(i)<cnt:cnt=dijkstra(i)ans=ireturn ans

http://www.lryc.cn/news/326352.html

相关文章:

  • Git学习笔记之基础
  • STCubeIDE 编译bootloader
  • Python学习:函数
  • docker run 使用 -p 命令一直显示端口被占用
  • Rust 实战练习 - 1. 输入,输出,环境变量,字符,字符串
  • RuoYi-Vue-Plus(登录流程)
  • 【数学】 【分数】 【字符串】972. 相等的有理数
  • 【4】DongshanPI-Seven 应用开发_文件IO
  • SEO 的未来:GPT 和 AI 如何改变关键词研究
  • 面试八股文之JAVA基础
  • 网络连接中——长连接和短连接详解
  • PEReDi 完全隐私的央行数字货币方案
  • yolov5+pyside6+登录+用户管理目标检测可视化源码
  • 电脑如何设置个性便签 电脑个性便签分享
  • 备考ICA----Istio实验12---配置双向TLS Istio Ingress Gateway实验
  • SpringBoot 统一后端返回格式、处理全局异常
  • C++学习基础版(一)
  • Rust 双向链表 LinkedList 和安全删除元素的方法
  • Android 开发中 Gradle 使用详解:构建、配置与优化技巧
  • 聚道云助力:易快报CDP无缝对接,登录同步一步到位!
  • Java解决幸运数字
  • 将一个nextjs项目部署到vercel
  • RocketMQ学习笔记:分布式事务
  • 单臂路由和三层交换机
  • 红岩思维导图的制作软件,分享4款热门的!
  • es 集群开机自动启动
  • 使用JMeter从JSON响应的URL参数中提取特定值
  • 汽车电子行业知识:自动驾驶系统结构和各模块功能
  • Oracle参数文件详解
  • 鸿蒙(HarmonyOS)Navigation如何实现多场景UI适配?