📅  最后修改于: 2023-12-03 15:42:22.237000             🧑  作者: Mango
本题为关于最短路算法的练习题,给定一张 $n$ 个点 $m$ 条边的有向图,请你求出 $1$ 号点到 $n$ 号点的最短距离。
第一行包含两个整数 $n$ 和 $m$。
接下来 $m$ 行,每行包含三个整数 $a, b, c$,表示存在一条从 $a$ 到 $b$ 边权为 $c$ 的有向边。
输出一个整数,表示 $1$ 号点到 $n$ 号点的最短距离,如果从 $1$ 号点无法到达 $n$ 号点,则输出 $-1$。
$1\leq n \leq 10^5$ $1\leq m \leq 10^6$ $1\leq a,b \leq n$ $-10000\leq c\leq 10000$
3 3
1 2 1
2 3 1
1 3 3
2
最短路算法:Dijkstra算法
import heapq
import sys
n, m = map(int, input().split())
graph = [[] for _ in range(n + 1)]
distance = [sys.maxsize] * (n + 1)
for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append([b, c])
def dijkstra(start):
q = []
heapq.heappush(q, [0, start])
distance[start] = 0
while q:
# 取出距离最短的点
dist, now = heapq.heappop(q)
# 이미 방문한 적이 있으면 패스
if distance[now] < dist:
continue
# 현재 노드와 연결된 다른 인접한 노드들을 확인
for i in graph[now]:
cost = dist + i[1]
# 현재 노드를 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, [cost, i[0]])
# 시작 노드는 1번 노드
dijkstra(1)
# distance[n]은 시작노드에서 n번 노드까지의 거리
if distance[n] == sys.maxsize:
print(-1)
else:
print(distance[n])
Dijkstra算法的时间复杂度为 $O((n + m)logm)$,其中 $n$ 表示点的数量,$m$ 表示边的数量。