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

代码随想录算法训练营第六十天|KM94.城市间货物运输Ⅰ|KM95.城市间货物运输Ⅱ|KM96.城市间货物运输Ⅲ

94. 城市间货物运输 I

2、Bellman_ford队列优化算法(又名SPFA)

        SPFA是对Bellman_ford算法的优化,由于Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。其实只需要对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了。

import collectionsdef main():n, m = map(int, input().strip().split())edges = [[] for _ in range(n+1)]for _ in range(m):src, dest, weight = map(int, input().strip().split())edges[src].append([dest, weight])# 初始化minDist = [float('inf')] * (n+1)# 第一个节点为0minDist[1] = 0que = collections.deque([1])visited = [False] * (n+1)visited[1] = Truewhile que:cur = que.popleft()visited[cur] = Falsefor dest, weight in edges[cur]:if minDist[cur] != float('inf') and minDist[cur] + weight < minDist[dest]:minDist[dest] = minDist[cur] + weightif visited[dest] == False:que.append(dest)visited[dest] = Trueif minDist[-1] == float('inf'):print('unconnnected')return minDist[-1]if __name__ == '__main__':print(main())

95. 城市间货物运输 II

        本题是要我们判断 负权回路,也就是图中出现环且环上的边总权值为负数。

        如果在这样的图中求最短路的话, 就会在这个环里无限循环 (也是负数+负数 只会越来越小),无法求出最短路径。(有负权回路的情况下,一直都会有更短的最短路,所以 松弛 第n次,minDist数组 也会发生改变。)

import collections
from math import inf
def main():n, m = map(int, input().strip().split())edges = [[] for _ in range(n+1)]# 记录节点接入队列的次数count = [0 for _ in range(n+1)]for _ in range(m):src, dest, weight = map(int, input().strip().split())edges[src].append([dest, weight])# 初始化minDist = [float('inf')] * (n+1)# 第一个节点为0minDist[1] = 0que = collections.deque([1])count[1] = 1flag = False# 主循环while que:cur = que.popleft()for dest, weight in edges[cur]:if minDist[cur] + weight < minDist[dest]:minDist[dest] = minDist[cur] + weightcount[dest] += 1if dest not in que:que.append(dest)if count[dest] == n:flag = Trueif flag:breakif flag:print('circle')else:if minDist[-1] == float('inf'):print('unconnected')else:print(minDist[-1])if __name__ == '__main__':main()

96. 城市间货物运输 III

本题理解起来有点难度,放着等二刷;

使用SPFA方法求解单源有限最短路;

from collections import deque
from math import infdef main():n, m = [int(i) for i in input().split()]graph = [[] for _ in range(n+1)]for _ in range(m):v1, v2, val = [int(i) for i in input().split()]graph[v1].append([v2, val])src, dst, k = [int(i) for i in input().split()]min_dist = [inf for _ in range(n+1)]min_dist[src] = 0  # 初始化起点的距离que = deque([src])while k != -1 and que:visited = [False for _ in range(n+1)]  # 用于保证每次松弛时一个节点最多加入队列一次que_size = len(que)temp_dist = min_dist.copy()  # 用于记录上一次遍历的结果for _ in range(que_size):cur_node = que.popleft()for next_node, val in graph[cur_node]:if min_dist[next_node] > temp_dist[cur_node] + val:min_dist[next_node] = temp_dist[cur_node] + valif not visited[next_node]:que.append(next_node)visited[next_node] = Truek -= 1if min_dist[dst] == inf:print("unreachable")else:print(min_dist[dst])if __name__ == "__main__":main()
http://www.lryc.cn/news/518735.html

相关文章:

  • 人工智能学习路线全链路解析
  • C++语言的学习路线
  • 用于与多个数据库聊天的智能 SQL 代理问答和 RAG 系统(3) —— 基于 LangChain 框架的文档检索与问答功能以及RAG Tool的使用
  • 20250110doker学习记录
  • MPU6050: 卡尔曼滤波, 低通滤波
  • C++的标准和C++的编译版本
  • python学习笔记—17—数据容器之字符串
  • UE5 使用内置组件进行网格切割
  • 51单片机——串口通信(重点)
  • Taro+Vue实现图片裁剪组件
  • PHP民宿酒店预订系统小程序源码
  • Hadoop3.x 万字解析,从入门到剖析源码
  • VUE3 常用的组件介绍
  • deepin-Wine 运行器合并打包器和添加从镜像提取 DLL 的功能
  • [大模型]本地离线运行openwebui+ollama容器化部署
  • 再次梳理ISP的大致流程
  • HBuilderX打包ios保姆式教程
  • 《解锁鸿蒙系统AI能力,开启智能应用开发新时代》
  • rhcsa练习(3)
  • 科研绘图系列:R语言绘制Y轴截断分组柱状图(y-axis break bar plot)
  • 跳出技术陷阱,探索财富自由的多元路径
  • qml SpringAnimation详解
  • 中学综合素质笔记3
  • uniapp vue2版本如何设置i18n
  • 【踩坑记录❌】ubuntu 安装 NVIDIA 显卡驱动不要 autoinstall
  • vue3 + ts + element-plus(el-upload + vuedraggable实现上传OSS并排序)
  • SQL开窗函数相关的面试题和答案
  • 【数据分析(一)】初探 Numpy
  • 国产化ARM平台-飞腾派开发板硬件与系统
  • [ LeetCode 75 ] 283 移动零(JavaScript)