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

    你可能感兴趣的文章
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>