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

    你可能感兴趣的文章
    php查最大值,在PHP数组中查找最大值
    查看>>
    php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
    查看>>
    php根据年月日计算年龄
    查看>>
    RabbitMQ - 单机部署(超详细)
    查看>>
    php检查注册,PHP检查注册的电子邮件地址是一个’school.edu’地址
    查看>>
    php模拟发送GET和POST请求
    查看>>
    RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo
    查看>>
    php模板引擎smarty
    查看>>
    php正则表达式模式
    查看>>
    php正则表达式的特殊字符含义
    查看>>
    PHP正则表达式获取武汉市的实时pm2.5数据并邮件发送phpmailer
    查看>>
    RabbitMQ + JMeter组合,优化你的中间件处理方式!
    查看>>
    PHP水仙花问题解法之一
    查看>>
    php没有解析是怎么回事,linux下php文件没有被剖析怎么办?_后端开发
    查看>>
    php注册页面实现注册后跳转页面
    查看>>
    PHP消息队列的实现方式与详解,值得一看
    查看>>
    PHP混合Go协程并发
    查看>>
    php源码中如何添加滚动公告,给WordPress网站添加滚动公告的方法
    查看>>
    PHP源码安装后如何新增模块
    查看>>
    php源码详细安装步骤,linux下php源码安装步骤
    查看>>