蓝桥20052 曲率驱动-权值变动dijkstra

懒得写了,记录下思路:
在n次修改的过程中进行n次全图dijkstra,原版dijkstra的初始dist是全[inf],但在n次过程中完成的dist会作为下一次全图计算的初始dist,堆大小10^6,
建n次图复杂度10^6
一个误区是dijkstra的初始状态是只有起点自身,是错误的,其实应该是已经所有查找过的路线

from math import inf
import heapq
n, m = map(int, input().split())
g = [[] for _ in range(n + 1)]
for _ in range(m):
    x, y, w = map(int, input().split())
    g[x].append([y, w])
    g[y].append([x, w])

k = int(input())
changes = list(map(int, input().split()))

dist = [inf] * (n + 1)
dist[1] = 0

def dijkstra():
    heap = []
    for i, dst in enumerate(dist):
        if dst != inf:
            heapq.heappush(heap, (dst, i))
    while heap:
        d, u = heapq.heappop(heap)
        if d > dist[u]:
            continue
        for v, weight in g[u]:
            if dist[u] + weight < dist[v]:
                dist[v] = dist[u] + weight
                heapq.heappush(heap, (dist[v], v))

dijkstra()
for change in changes:
    for i in range(1, n + 1):
        for j, _ in enumerate(g[i]):
            g[i][j][1] ^= change
    dijkstra()
for x in dist[1:]:
    print(x if x != inf else -1, end = ' ')
posted @   凉叶染香  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示