蓝桥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 = ' ')
浙公网安备 33010602011771号