📜  门|门 CS 1997 |第 32 题(1)

📅  最后修改于: 2023-12-03 15:12:45.953000             🧑  作者: Mango

题目介绍:门|门 CS 1997 | 第 32 题

题目描述

有 $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])
题目链接

门|门 CS 1997 |第 32 题