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

    你可能感兴趣的文章
    一张图搞定RPC框架核心原理
    查看>>
    他来了他来了,他带着云栖大会的免费门票走来了
    查看>>
    获取linux 主机cpu类型
    查看>>
    测试tensorflow是否安装成功 出现 SyntaxError: invalid syntax的错误
    查看>>
    Flask--简介
    查看>>
    16 python基础-恺撒密码
    查看>>
    Frame--Api框架
    查看>>
    Boostrap技能点整理之【网格系统】
    查看>>
    javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
    查看>>
    ssm(Spring+Spring mvc+mybatis)——updateDept.jsp
    查看>>
    Git简单理解与使用
    查看>>
    echarts 基本图表开发小结
    查看>>
    adb通过USB或wifi连接手机
    查看>>
    JDK9-15新特性
    查看>>
    Vector 实现类
    查看>>
    TreeSet、TreeMap
    查看>>
    JVM内存模型
    查看>>
    可变长度参数
    查看>>
    3、条件查询
    查看>>
    cordova打包apk更改图标
    查看>>