📅  最后修改于: 2023-12-03 15:12:45.953000             🧑  作者: Mango
有 $N$ 个门,第 $i$ 个门标有整数 $A_i$ 与 $B_i$,表示从这个门离开后会来到第 $A_i$ 个门或第 $B_i$ 个门。已知从起点 $S$ 出发到第 $i$ 个门的最短距离为 $D_i$,求从起点 $S$ 出发到达各个门的最短距离 $D$。
第一行包含整数 $N$。
接下来 $N$ 行,每行包含三个整数 $A_i$、$B_i$ 和 $D_i$,用来表示第 $i$ 个门会到达的两个地方与到达这个门的距离。
最后一行包含起点 $S$。
输出从起点 $S$ 出发到达各个门的最短距离 $D$,每个答案占一行。
4
2 3 2
4 1 1
3 1 3
1 3 4
4
4
4
2
3
本题可以使用广度优先搜索(BFS),由于涉及到图,因此可以通过邻接表的方式存储。需要注意的是,由于每个门有两个选项,因此可能存在一个门被多次访问的情况,在这种情况下应该只保留最小的距离值。因此,为了方便起见,可以使用一个最小堆来维护距离值。
from heapq import heappush, heappop
N = int(input())
# 初始化邻接表
g = [[] for i in range(N)]
for i in range(N):
a, b, d = map(int, input().split())
g[i].append((a-1, d))
g[i].append((b-1, d))
S = int(input()) - 1
# 初始化距离数组
D = [float("inf") for i in range(N)]
D[S] = 0
# 初始化最小堆
Q = [(0, S)]
# 堆排序过程
while len(Q) > 0:
d, u = heappop(Q)
if d > D[u]:
continue
for v, w in g[u]:
if D[v] > D[u] + w:
D[v] = D[u] + w
heappush(Q, (D[v], v))
# 输出到达各个门的最短距离
for i in range(N):
print(D[i])