博客
关于我
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/

    你可能感兴趣的文章
    postgres--流复制
    查看>>
    postgres10配置huge_pages
    查看>>
    PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
    查看>>
    PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
    查看>>
    Postgresql 12.9如何配置允许远程连接
    查看>>
    PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别 应用场景分析
    查看>>
    Postgresql CopyManager 流式批量数据入库
    查看>>
    PostgreSQL cube 插件 - 多维空间对象
    查看>>
    PostgreSQL Daily Maintenance - cluster table
    查看>>
    PostgreSQL on Linux 最佳部署手册
    查看>>
    PostgreSQL Oracle 兼容性之 - pipelined
    查看>>
    PostgreSQL Point-In-Time Recovery (Incremental Backup)
    查看>>
    postgresql Streaming Replication监控与注意事项
    查看>>
    postgresql 不需要付费_使用数据传输在PostgreSQL执行 外部连接运算符
    查看>>
    postgresql 主从配置_生产环境postgresql主从环境配置
    查看>>
    postgresql 函数&存储过程 ; 递归查询
    查看>>
    PostgreSQL 分组聚合查询中 filter 子句替换 case when
    查看>>
    PostgreSQL 同步流复制锁瓶颈分析
    查看>>