【算法】图论 —— Dijkstra算法 python



引入


非负权边单源最短路

时间复杂度 O( m l o g n mlogn mlogn)


模板

https://www.luogu.com.cn/problem/P4779

import heapq as hq  def dijkstra(s):  # dis表示从s到i的最短路  dis = [float('inf')] * (n + 1)  # vis表示i是否出队列  vis = [0] * (n + 1)  q = []  dis[s] = 0  hq.heappush(q, (0, s))  while q:  d, u = hq.heappop(q)  if vis[u]:  continue  vis[u] = 1  for v, w in g[u]:  dis[v] = min(dis[v], dis[u] + w)  hq.heappush(q, (dis[v], v))  for i in range(1, n + 1):  if dis[i] == float('inf'):  dis[i] = -1  return dis[1:]  n, m, s= map(int, input().split())  
g = [[] for _ in range(n + 1)]  
for _ in range(m):  u, v, w = map(int, input().split())  g[u].append((v, w))  
print(*dijkstra(s))


实战演练


L2 001 紧急救援

维护多个数组并得到具体路径

import heapq as hq  
import sys  
input = sys.stdin.readline  
inf = float('inf')  def dijkstra(s, ed):  q = []  vis = [0] * n  dis = [inf] * n  pre = [-1] * n  cnt = [0] * n  # 最短路径数量  res = [0] * n  # 能召集的最大救援队数量  dis[s] = 0  cnt[s] = 1  res[s] = a[s]  hq.heappush(q, (0, s))  while q:  d, u = hq.heappop(q)  if u == ed:  return dis[ed], cnt[ed], res[ed], pre  if vis[u]:  continue  vis[u] = 1  for (v, w) in g[u]:  if dis[v] > dis[u] + w:  dis[v] = dis[u] + w  cnt[v] = cnt[u]  res[v] = res[u] + a[v]  pre[v] = u  hq.heappush(q, (dis[v], v))  elif dis[v] == dis[u] + w:  cnt[v] += cnt[u]  # 更新最短路径数量  if res[v] < res[u] + a[v]:  res[v] = res[u] + a[v]  pre[v] = u  return -1, -1, -1, pre  n, m, s, ed = map(int, input().split())  
a = list(map(int, input().split()))  
g = [[] for _ in range(n)]  
for _ in range(m):  u, v, w = map(int, input().split())  g[u].append((v, w))  g[v].append((u, w))  # 无向图  dist, cnt, res, pre = dijkstra(s, ed)  
if dist != -1:  print(cnt, res)  path = []  while ed != -1:  # 从终点回溯路径  path.append(ed)  ed = pre[ed]  path.reverse()  # 反转路径  print(' '.join(map(str, path)))


https://www.lanqiao.cn/problems/3818/learning/

import sys  
import heapq as hq  
input = sys.stdin.readline  def get(c):  if c == '.':  return 0  else:  return ord(c) - ord('A') + 1  def dijkstra():  q = []  dis = [[float('inf')] * m for _ in range(n)]  vis = [[0] * m for _ in range(n)]  dis[x1][y1] = 0  hq.heappush(q, (0, x1, y1))  while q:  d, x, y = hq.heappop(q)  if x == x2 and y == y2:  return d  if vis[x][y]:  continue  vis[x][y] = 1  for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:  nx, ny = x + dx, y + dy  if 0 <= nx < n and 0 <= ny < m and a[nx][ny] != '#' and not vis[nx][ny]:  dis[nx][ny] = min(dis[nx][ny], dis[x][y] + get(a[nx][ny]))  hq.heappush(q, (dis[nx][ny], nx, ny))  return float('inf')  n, m = map(int, input().split())  
x1, y1, x2, y2 = map(int, input().split())  
x1 -= 1  
x2 -= 1  
y1 -= 1  
y2 -= 1  
a = [input() for _ in range(n)]  
e = int(input())  if e >= dijkstra():  print('Yes')  
else:  print('No')


https://ac.nowcoder.com/acm/contest/99909/E

对于每条边 ( u , v ) (u,v) (u,v),如果这条边在某条最短路上的话,则一定满足:
dis[u] + w + dis[v] == dis[n] ,即 最短路从 1 到 u ,再从 u 到 v ,再从 v 到 n 最短路从 1 到 u,再从 u 到 v,再从 v 到 n 最短路从1u,再从uv,再从vn。(或者是 u , v u,v u,v反过来)

import sys  
input = sys.stdin.readline  
inf = float('inf')  
import heapq as hp  def dijkstra(s):  dis = [inf] * (n + 1)  vis = [0] * (n + 1)  q = [(0, s)]  dis[s] = 0  while q:  d, u = hp.heappop(q)  if vis[u]:  continue  vis[u] = 1  for v, w in g[u]:  if dis[v] > dis[u] + w:  dis[v] = dis[u] + w  hp.heappush(q, (dis[v], v))  return dis  t = int(input())  
for _ in range(t):  n, m = map(int, input().split())  g = [[] for _ in range(n + 1)]  edge = []  for i in range(m):  u, v, w = map(int, input().split())  g[u].append((v, w))  g[v].append((u, w))  edge.append((u, v, w))  dis1 = dijkstra(1)  disn = dijkstra(n)  res = []  for u, v, w in edge:  # 检查是否在最短路径中  if dis1[u] != inf and disn[v] != inf and (dis1[u] + w + disn[v] == dis1[n]):  res.append('1')  elif dis1[v] != inf and disn[u] != inf and (dis1[v] + w + disn[u] == dis1[n]):  res.append('1')  else:  res.append('0')  print(''.join(res))


END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

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

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

相关文章

SmolVLM2 - 将视频理解带到每个设备

本文翻译整理自&#xff1a;SmolVLM2: Bringing Video Understanding to Every Device https://huggingface.co/blog/smolvlm2 文章目录 TL;DR: SmolVLM 现在可以观看 &#x1f4fa; 并拥有更好的视觉理解一、关于 SmolVLM2二、 技术细节1、SmolVLM2 2.2B: 我们新的视觉和视频明…

Cocos Creator Shader入门实战(三):CCEffect参数配置讲解

引擎版本&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 稍微回顾下前面两篇博客讲解的内容&#xff1a; 一、Cocos渲染效果的实现需要Material材质和Effect资源的互相配合。 二、Effect资源负责Shader片段的编写和属性配置&#xff0c;Material材质负责对E…

计算机毕业设计:公司烤箱配件质量信息追溯系统

超级管理员表创建语句如下&#xff1a; 公司烤箱配件质量信息追溯系统mysql数据库创建语句公司烤箱配件质量信息追溯系统oracle数据库创建语句公司烤箱配件质量信息追溯系统sqlserver数据库创建语句公司烤箱配件质量信息追溯系统springspringMVCmybatis框架对象(javaBean,pojo…

【移动WEB开发】rem适配布局

目录 1. rem基础 2.媒体查询 2.1 语法规范 2.2 媒体查询rem 2.3 引入资源&#xff08;理解&#xff09; 3. less基础 3.1 维护css的弊端 3.2 less介绍 3.3 less变量 3.4 less编译 3.5 less嵌套 3.6 less运算 4. rem适配方案 4.1 rem实际开发 4.2 技术使用 4.3 …

Java后端高频面经——计算机网络

TCP/IP四层模型&#xff1f;输入一个网址后发生了什么&#xff0c;以百度为例&#xff1f;&#xff08;美团&#xff09; &#xff08;1&#xff09;四层模型 应用层&#xff1a;支持 HTTP、SMTP 等最终用户进程传输层&#xff1a;处理主机到主机的通信&#xff08;TCP、UDP&am…

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…

《Python实战进阶》No16: Plotly 交互式图表制作指南

No16: Plotly 交互式图表制作指南 Plotly是一款用来做数据分析和可视化的在线平台&#xff0c;功能真的是非常强大&#xff0c;它主要有以下特点&#xff1a; 图形多样化&#xff1a;在线绘制多种图形&#xff0c;比如柱状图、饼图、直方图、饼图、气泡图、桑基图、股票图、旭…

贪心算法--

1.柠檬水找零 link:860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法&#xff0c; 优先花出大面额bill&#xff0c; 尽可能保护小面额billint five 0, ten 0;// 不…

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例 一、引言&#xff1a;智能化时代的提示工程工具 在人工智能技术广泛应用的时代背景下&#xff0c;如何与AI模型进行有效交互已成为关键技能。本文介绍的"AI任务需求与提示语策略生成器"正是基于…

【MySQL】(4) 表的操作

一、创建表 语法&#xff1a; 示例&#xff1a; 生成的数据目录下的文件&#xff1a; 二、查看表结构 三、修改表 语法&#xff1a; 另一种改表名语法&#xff1a;rename table old_name1 to new_name1, old_name2 to new_name2; 示例&#xff1a; 四、删除表 语法&#xf…

基于STM32物联网水质监测系统的设计与实现/基于STM32的水产养殖云监控系统设计

1. 系统方案介绍 随着水质污染问题的日益严峻&#xff0c;实时监测水质变得尤为重要。水质监测系统能够通过采集水体中的各种数据&#xff0c;及时发现水质问题&#xff0c;保障饮用水安全。本文将介绍一款基于STM32单片机的物联网水质监测系统&#xff0c;该系统采用了ESP826…

装饰器模式--RequestWrapper、请求流request无法被重复读取

目录 前言一、场景二、原因分析三、解决四、更多 前言 曾经遇见这么一段代码&#xff0c;能看出来是把request又重新包装了一下&#xff0c;核心信息都不会改变 后面了解到这叫 装饰器模式&#xff08;Decorator Pattern&#xff09; &#xff1a;也称为包装模式(Wrapper Pat…

IO多路复用实现并发服务器

一.select函数 select 的调用注意事项 在使用 select 函数时&#xff0c;需要注意以下几个关键点&#xff1a; 1. 参数的修改与拷贝 readfds 等参数是结果参数 &#xff1a; select 函数会直接修改传入的 fd_set&#xff08;如 readfds、writefds 和 exceptfds&#xf…

解决火绒启动时,报安全服务异常,无法保障计算机安全

1.找到控制面板-安全和维护-更改用户账户控制设置 重启启动电脑解决。

【Docker】容器安全之非root用户运行

【Docker】容器安全之非root用户运行 1. 场景2. 原 Dockerfile 内容3. 整改结果4. 非 root 用户带来的潜在问题4.1 文件夹读写权限异常4.2 验证文件夹权限 1. 场景 最近有个项目要交付&#xff0c;第三方测试对项目源码扫描后发现一个问题&#xff0c;服务的 Dockerfile 都未指…

3.9[A]csd

在传统CPU中心架构中&#xff0c;中央处理器通过内存访问外部存储器&#xff0c;而数据必须经过网络接口卡才能到达外部存储器。这种架构存在集中式计算、DRAM带宽和容量挑战、大量数据移动&#xff08;服务器内和网络&#xff09;以及固定计算导致工作负载容量增长等问题。 而…

嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库

目录 步骤 1&#xff1a;准备工作 步骤 2&#xff1a;创建 Keil 项目&#xff0c;并配置工程 步骤 3&#xff1a;在MDK工程上添加 CMSIS-DSP 库 步骤 5&#xff1a;编写代码 步骤 6&#xff1a;配置时钟和优化 步骤 7&#xff1a;调试与验证 步骤 8&#xff1a;优化和调…

个人学习编程(3-06) 搜索

树的高度&#xff1a; 题目&#xff1a; PS G:\vscodetest> .\ab.exe 5 5 1 2 1 4 1 5 2 3 3 #include <stdio.h> #include <vector> #include <queue> using namespace std; int main() {int n,m;scanf("%d %d",&n,&m);vector<vec…

QwQ-32B 开源!本地部署+微调教程来了

今天&#xff0c;通义千问开源了推理模型QwQ-32B QwQ-32B 在一系列基准测试中进行了评估&#xff0c;测试了数学推理、编程能力和通用能力。以下结果展示了 QwQ-32B 与其他领先模型的性能对比&#xff0c;包括 DeepSeek-R1-Distilled-Qwen-32B、DeepSeek-R1-Distilled-Llama-7…

【鸿蒙开发】Windows平台MQTT服务器搭建教程

00. 目录 文章目录 00. 目录01. MQTT概述02. MQTT服务器下载03. MQTT服务器安装04. MQTT服务器配置05. MQTT服务器启动06. 附录 01. MQTT概述 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订…