1003 Emergency (25分)
发布日期:2021-05-28 05:49:53 浏览次数:23 分类:精选文章

本文共 2174 字,大约阅读时间需要 7 分钟。

为了解决这个问题,我们需要找到从城市C1到城市C2的最短路径数量以及这条路径上所能聚集的救援队伍数量的最大值。我们将使用优化后的Dijkstra算法来实现这一点。

方法思路

  • 问题分析:我们需要找到从C1到C2的最短路径和路径数量,同时也要考虑路径上城市的救援队伍数量之和的最大值。
  • 算法选择:使用优化后的Dijkstra算法。这种算法可以在计算最短路径的同时,记录路径数量和权重总和。
  • 数据结构
    • 使用邻接矩阵来存储图的结构,每个边的信息都包含在其中。
    • 用两个数组dw分别存储从起点到各个节点的最短距离和最大的救援队伍数量之和。
    • 用数组num存储从起点到各个节点的最短路径数量。
  • 优化步骤
    • 每次处理距离最小的节点,检查其所有邻居。
    • 当找到更短的路径时,更新相应的值并加入优先队列。
    • 当找到等距离但权重大路径时,更新权重和路径数量。
  • 解决代码

    import heapq
    def 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数组记录最大的救援队伍数量之和。
  • 优先队列处理:使用优先队列按最短距离处理节点,更新每个邻居的最优路径。
  • 输出结果:打印目标节点C2的最短路径数量和最大的救援队伍数量之和。
  • 通过这种方法,我们可以高效地解决问题,得到需要的结果。

    上一篇:android调用系统播放器
    下一篇:android调用系统的自定义裁剪后得到的图片不清晰,使用MediaStore.EXTRA_OUTPUT获取缓存下的清晰图片...

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年05月04日 12时56分30秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    el-select下拉框修改背景色 2025-03-29
    Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制) 2025-03-29
    Elasticsearch入门教程(Elasticsearch7,linux) 2025-03-29
    ElasticSearch设置字段的keyword属性 2025-03-29
    elasticsearch配置文件里的一些坑 [Failed to load settings from [elasticsearch.yml]] 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
    2024数字安全创新性案例报告,从零基础到精通,收藏这篇就够了! 2025-03-29
    2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
    2025版最新一文彻底搞懂大模型 - Agent(非常详细)零基础入门到精通,收藏这篇就够了 2025-03-30
    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