博客
关于我
201609-4 交通规划 ccf
阅读量:281 次
发布时间:2019-03-01

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

G国国王想将现有的铁路改造为高速铁路,使得所有城市间可以通过高速铁路到达,并且从所有城市到首都的最短路程与原来的铁路系统一样。为了实现这一目标,我们需要找出最少需要改造的铁路长度。

首先,我们需要分析现有的铁路网络。我们可以使用Dijkstra算法来计算从首都到所有城市的最短路径距离。然后,对于每条铁路,检查它是否在这些最短路径上。如果不在,则需要改造。反之,则可以保留这条铁路。

具体来说,我们可以:

  • 计算最短路径:使用Dijkstra算法计算从首都到所有城市的最短路径距离。由于铁路是双向的,我们还需要考虑从所有城市到首都的最短路径距离。
  • 判断铁路是否在最短路径上:对于每条铁路a-b,检查是否存在从首都到a,再经过这条铁路到达b,且总长度等于从首都到b的最短距离。如果存在,则这条铁路在最短路径上,否则需要改造。
  • 统计需要改造的铁路长度:将所有不在最短路径上的铁路的长度相加,即为最少需要改造的铁路长度。
  • 样例分析

    在样例输入中,首都是1号城市。计算得到从首都到各城市的最短距离如下:

    • 1号到2号:4
    • 1号到3号:5
    • 1号到4号:7

    接下来,检查每条铁路是否在这些最短路径上:

    • 1-2(长度4)在1号到2号的最短路径上。
    • 1-3(长度5)在1号到3号的最短路径上。
    • 2-3(长度2)不在1号到3号的最短路径上,因为1-3的长度5比1-2-3的长度7更短。
    • 2-4(长度3)不在1号到4号的最短路径上,因为1-2-4的长度7比1-3-4的长度7更长。
    • 3-4(长度2)不在1号到4号的最短路径上,因为1-3-4的长度7比1-2-4的长度7更长。

    因此,需要改造的铁路有2-3(长度2)和3-4(长度2),总长度为4。

    代码实现

    import heapqdef main():    import sys    input = sys.stdin.read    data = input().split()        n = int(data[0])    m = int(data[1])        edges = [[] for _ in range(n)]    index = 2    for _ in range(m):        a = int(data[index])-1        b = int(data[index+1])-1        c = int(data[index+2])        edges[a].append((b, c))        edges[b].append((a, c))        index += 3        def dijkstra(start):        dist = [float('inf')] * n        dist[start] = 0        heap = []        heapq.heappush(heap, (0, start))        visited = [False] * n                while heap:            current_dist, u = heapq.heappop(heap)            if visited[u]:                continue            visited[u] = True            for v, w in edges[u]:                if not visited[v] and dist[v] > dist[u] + w:                    dist[v] = dist[u] + w                    heapq.heappush(heap, (dist[v], v))        return dist        dist_to_capital = dijkstra(0)    dist_from_capital = dijkstra(n-1)        total = 0        for i in range(n):        for j, c in edges[i]:            if dist_to_capital[i] + c == dist_to_capital[j] or dist_from_capital[i] + c == dist_from_capital[j]:                continue            total += c        print(total)if __name__ == "__main__":    main()

    代码解释

  • 输入处理:读取输入数据,构建铁路网络。
  • Dijkstra算法:计算从首都到所有城市的最短路径距离和从所有城市到首都的最短路径距离。
  • 判断铁路是否在最短路径上:对于每条铁路,检查它是否在最短路径上。如果不在,则将其长度加到总和中。
  • 输出结果:输出需要改造的铁路总长度。
  • 通过这种方法,我们可以高效地确定最少需要改造的铁路长度,以满足G国国王的要求。

    转载地址:http://kubx.baihongyu.com/

    你可能感兴趣的文章
    PostgreSQL学习总结(9)—— PostgreSQL 运算符与表达式
    查看>>
    PostGreSql学习笔记001---PostgreSQL10.4安装(Windows)_支持PostGreGis_PostJDBC
    查看>>
    PostGreSql学习笔记002---Navicat Premium中管理PostGreSql 错误:字段rolcatupdate 不存在
    查看>>
    PostgreSQL学习笔记:PostgreSQL vs MySQL
    查看>>
    PostgreSQL实现shape数据转geojson数据(地图工具篇.18)
    查看>>
    PostgreSQL导入shape数据(地图工具篇.10)
    查看>>
    PostGreSql工作笔记003---在Navicat中创建数据库时报错rolcatupdate不存在_具体原因看其他博文_这里使用pgAdmin4创建管理postgre
    查看>>
    PostGreSql工作笔记004---PostGreSql修改密码_windows和linux下修改
    查看>>
    Postgresql常用命令行操作_以及Navicat操作PostGis时的问题_自动截取长度_WKB structure does not match exp---PostgreSQL工作笔记005
    查看>>
    PostgreSQL忘记密码
    查看>>
    PostgreSQL数据库pg_dump命令行不输入密码的方法
    查看>>
    PostgreSQL新手入门
    查看>>
    postgresql树状结构查询示例
    查看>>
    PostgreSQL流复制参数max_wal_senders详解
    查看>>
    postgresql流复制配置
    查看>>
    PostgreSQL清空表并保留表结构、清空数据库还原数据库为新建时的状态的方法
    查看>>
    PostgreSQL的 initdb 源代码分析之九
    查看>>
    PostgreSQL的安装与使用指南
    查看>>
    postgresql编译安装及配置
    查看>>
    PostgreSQL远程连接配置
    查看>>