📜  门|门CS 2008 |第 54 题(1)

📅  最后修改于: 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$ 表示边的数量。