博客
关于我
The Shortest Path in Nya Graph HDU - 4725 (建图+最短路)
阅读量:801 次
发布时间:2019-03-25

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

为了找到从1到n的最短路径,可以将每一层和每个顶点压缩为一个节点。每一层内部的顶点连接到同一层的其他顶点,并通过网络层之间的边处理成本c。这样,可以将问题转化为带层的最短路径问题,从而高效地使用Dijkstra算法来找到最短路径。

步骤解释:

  • 图的压缩: 将每个层视为一个节点,每层内部的顶点连接到同一层的其他顶点,添加权重为0的边。

  • 处理层间边: 将每一层u的顶点与上下一层u+1和u-1的顶点建立权重为c的边。

  • 初始设定: 起点为层1,终点为层n。使用优先队列执行Dijkstra算法,计算各节点的最短距离。

  • 优化递减: 通过层分割,将问题规模降低到可处理范围,使得解决时间更为合理。

  • 实现代码(Python):

    import heapqdef main():    import sys    input = sys.stdin.read().split()    ptr = 0    T = int(input[ptr])    ptr += 1        max_layer = 2 * (10**5) + 2    INF = 1e18    layers = T    for _ in range(T):        n = int(input[ptr])        m = int(input[ptr+1])        c = int(input[ptr+2])        ptr +=3                size = 2 * n + 2        g = [[] for _ in range(size)]                visited = [False]*(size)        dist = [INF]*(size)                for t in range(1, n+1):            layer = t + n +1  # layer starts at n+2            g[layer].append( (0, t) )            g[t].append( (c, layer) )            g[t].append( (c, layer+1) )                for _ in range(m):            u = int(input[ptr])            v = int(input[ptr+1])            w = int(input[ptr+2])            ptr +=3            if u <= v:                g[u].append( (w, v) )            else:                g[v].append( (w, u) )                dist[1] = 0        heap = [ (0, 1) ]        heapq.heapify(heap)                while heap:            d, u = heapq.heappop(heap)            if visited[u]:                continue            visited[u] = True            if u == n +1:  #目标层的第一个节点?                # 出现疑问,需要确认层的编号是否正确                break            for v_edge, weight in g[u]:                if not visited[v_edge]:                    if dist[v_edge] > d + weight:                        dist[v_edge] = d + weight                        heapq.heappush(heap, (dist[v_edge], v_edge))                min_distance = dist[n]        if min_distance == INF:            print(-1)        else:            print(min_distance)        return        if __name__ == "__main__":    main()

    代码解释:

    • 输入处理: 读取输入数据并解析成对应的变量。
    • 图的构建: 创建邻接表g,将同一层的顶点连接到同一层,跨层顶点之间建立权重为c的边。
    • Dijkstra算法: 从起点节点开始,使用优先队列处理每个节点,计算最短距离并记录结果。
    • 结果输出: 根据计算结果输出最短距离,若无法到达则返回-1。

    通过压缩节点和使用优先队列优化,Dijkstra算法在较小的节点数规模下高效运行,解决了大规模图的最短路径问题。

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

    你可能感兴趣的文章
    JavaSE总结
    查看>>
    手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
    查看>>
    Python IO编程
    查看>>
    CSS入门总结
    查看>>
    使用 TortoiseGit 时,报 Access denied 错误
    查看>>
    基于 HTML5 WebGL 的污水处理厂泵站自控系统
    查看>>
    django-表单之模型表单渲染(六)
    查看>>
    c++之程序流程控制
    查看>>
    spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
    查看>>
    有道云笔记 同步到我的博客园
    查看>>
    李笑来必读书籍整理
    查看>>
    Hadoop(十六)之使用Combiner优化MapReduce
    查看>>
    《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
    查看>>
    CoreCLR源码探索(八) JIT的工作原理(详解篇)
    查看>>
    andriod 开发错误记录
    查看>>
    C语言编译错误列表
    查看>>
    看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
    查看>>
    CentOS5 Linux编译PHP 报 mysql configure failed 错误解决办法
    查看>>
    pycharm新建文件夹时新建python package和新建directory有什么区别?
    查看>>
    python中列表 元组 字典 集合的区别
    查看>>