题目:
解答:
class Solution:
def secondMinimum(self, n : int, edges: List[List[int]], time: int, change: int) -> int:
#BFS:求解权重相同的最短路径问题
#graph:邻接矩阵
graph = [[] for _ in range(n + 1)]
for e in edges:
x, y = e[0], e[1]
graph[x].append(y)
graph[y].append(x)
#print(graph)
# dist[i][0] 表示从 1 到 i 的最短路长度,dist[i][1] 表示从 1 到 i 的严格次短路长度
dist = [[float('inf')] * 2 for _ in range(n + 1)]
dist[1][0] = 0
#q:记录(当前节点,点1到当前节点的路径长度)
q=deque([(1, 0)])
while dist[n][1] == float('inf'):
cur = q.popleft()
#遍历当前节点的邻接点
for y in graph[cur[0]]:
d = cur[1] + 1
#如果d<当前最短路,则对最短路进行更新
if d < dist[y][0]:
dist[y][0] = d
q.append((y, d))
#如果最短路<d<次短路,则对次短路进行更新
elif dist[y][0] < d < dist[y][1]:
dist[y][1] = d
q.append((y, d))
ans = 0
for _ in range(dist[n][1]):
#判断是否需要等待,若需要则需加上等待时间
if ans % (change * 2) >= change:
ans += change * 2 - ans % (change * 2)
ans += time
return ans