from collections import deque
def main():
n, m = map(int, input().split())
grid = [[] for _ in range(n + 1)]
for _ in range(m):
s, t, w = map(int, input().split())
grid[s].append((t, w))
minDist = [float('inf')] * (n + 1)
visited = [False] * (n + 1)
que = deque()
minDist[1] = 0
que.append(1)
visited[1] = True
while que:
s = que.popleft()
visited[s] = False
for t, w in grid[s]:
if minDist[t] > minDist[s] + w:
minDist[t] = minDist[s] + w
if not visited[t]:
que.append(t)
visited[t] = True
if minDist[n] == float('inf'):
print('unconnected')
else:
print(minDist[n])
if __name__ == '__main__':
main()
# 无队列优化的(这个时间太长,有一定概率超时)
from collections import deque
def main():
n, m = map(int, input().split())
edges = [tuple(map(int, input().split())) for _ in range(m)]
minDist = [float('inf')] * (n + 1)
minDist[1] = 0
for i in range(n):
updated = False
for s, t, w in edges:
if minDist[s] != float('inf') and minDist[s] + w < minDist[t]:
minDist[t] = minDist[s] + w
updated = True
if not updated:
break
if i == n - 1:
print('circle')
return 0
if minDist[n] == float('inf'):
print('unconnected')
else:
print(minDist[n])
if __name__ == '__main__':
main()
# 队列优化的
from collections import deque
def main():
n, m = map(int, input().split())
grid = [[] for _ in range(n + 1)]
for _ in range(m):
s, t, w = map(int, input().split())
grid[s].append((t, w))
minDist = [float('inf')] * (n + 1)
visited = [False] * (n + 1)
cnt = [0] * (n + 1)
que = deque()
minDist[1] = 0
que.append(1)
visited[1] = True
cnt[1] += 1
while que:
s = que.popleft()
visited[s] = False
for t, w in grid[s]:
if minDist[t] > minDist[s] + w:
minDist[t] = minDist[s] + w
if not visited[t]:
que.append(t)
visited[t] = True
cnt[t] += 1
if cnt[t] == n:
print('circle')
return
if minDist[n] == float('inf'):
print('unconnected')
else:
print(minDist[n])
if __name__ == '__main__':
main()
再多走一次松弛就行了。
96. 城市间货物运输 III
from collections import deque
def main():
n, m = map(int, input().split())
edges = [tuple(map(int, input().split())) for _ in range(m)]
src, dst, k = map(int, input().split())
minDist = [float('inf')] * (n + 1)
minDist[src] = 0
for i in range(k + 1):
minDist_copy = minDist.copy()
updated = False
for s, t, w in edges:
if minDist_copy[s] != float('inf') and minDist_copy[s] + w < minDist[t]:
minDist[t] = minDist_copy[s] + w
updated = True
if not updated:
break
if minDist[dst] == float('inf'):
print('unreachable')
else:
print(minDist[dst])
if __name__ == '__main__':
main()
ok!!!理解!