
1003 Emergency (25分)
问题分析:我们需要找到从C1到C2的最短路径和路径数量,同时也要考虑路径上城市的救援队伍数量之和的最大值。 算法选择:使用优化后的Dijkstra算法。这种算法可以在计算最短路径的同时,记录路径数量和权重总和。 数据结构: 优化步骤: 读取输入:读取图的结构,包括节点数、边数、起点、终点、每个节点的相救队伍数量和每条边的长度。 初始化邻接矩阵:使用邻接矩阵存储图的结构。 初始化数据结构: 优先队列处理:使用优先队列按最短距离处理节点,更新每个邻居的最优路径。 输出结果:打印目标节点C2的最短路径数量和最大的救援队伍数量之和。
发布日期:2021-05-28 05:49:53
浏览次数:23
分类:精选文章
本文共 2174 字,大约阅读时间需要 7 分钟。
为了解决这个问题,我们需要找到从城市C1到城市C2的最短路径数量以及这条路径上所能聚集的救援队伍数量的最大值。我们将使用优化后的Dijkstra算法来实现这一点。
方法思路
- 使用邻接矩阵来存储图的结构,每个边的信息都包含在其中。
- 用两个数组
d
和w
分别存储从起点到各个节点的最短距离和最大的救援队伍数量之和。 - 用数组
num
存储从起点到各个节点的最短路径数量。
- 每次处理距离最小的节点,检查其所有邻居。
- 当找到更短的路径时,更新相应的值并加入优先队列。
- 当找到等距离但权重大路径时,更新权重和路径数量。
解决代码
import heapqdef main(): import sys input = sys.stdin.read().split() idx = 0 n = int(input[idx]) idx += 1 m = int(input[idx]) idx += 1 st = int(input[idx]) idx += 1 ed = int(input[idx]) idx += 1 # 芝加利亚优先队列 # keys is (distance, city) h = [] INF = float('inf') weight = [0] * n for i in range(n): weight[i] = int(input[idx]) idx += 1 # 初始化邻接矩阵 adj = [[] for _ in range(n)] for _ in range(m): a = int(input[idx]) idx += 1 b = int(input[idx]) idx += 1 l = int(input[idx]) idx += 1 adj[a].append((b, l)) adj[b].append((a, l)) # 初始化距离、路径数、权重大数组 d = [INF] * n num = [0] * n w = [0] * n # 起点处理 d[st] = 0 num[st] = 1 w[st] = weight[st] heapq.heappush(h, (0, st)) while h: current_d, u = heapq.heappop(h) if current_d > d[u]: continue # 遍历u的所有邻居 for (v, l) in adj[u]: new_d = current_d + l # 判断是否是新的更优路径 if new_d < d[v]: d[v] = new_d num[v] = num[u] w[v] = w[u] + weight[v] heapq.heappush(h, (new_d, v)) elif new_d == d[v]: # 权重的比较 if (w[u] + weight[v]) > w[v]: # 新路径权重更大,更新w,并增加路径数 w[v] = w[u] + weight[v] num[v] += num[u] heapq.heappush(h, (new_d, v)) print(num[ed], w[ed])if __name__ == "__main__": main()
代码解释
d
数组记录最短距离,num
数组记录最短路径数量,w
数组记录最大的救援队伍数量之和。通过这种方法,我们可以高效地解决问题,得到需要的结果。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月04日 12时56分30秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
el-select下拉框修改背景色
2025-03-29
Elasticsearch入门教程(Elasticsearch7,linux)
2025-03-29
ElasticSearch设置字段的keyword属性
2025-03-29
Elasticsearch面试题
2025-03-29
15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
2024年非科班的人合适转行做程序员吗?
2025-03-29
2024数字安全创新性案例报告,从零基础到精通,收藏这篇就够了!
2025-03-29
2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
Java基础学习总结(47)——JAVA输入输出流再回忆
2025-04-02
Java基础学习总结(4)——对象转型
2025-04-02
Java基础学习总结(73)——Java最新面试题汇总
2025-04-02
Java基础:按位运算符
2025-04-03
Java基础:比较运算符
2025-04-03
Kubernetes 集群卸载清理
2025-04-03