1.Dijkstra算法(单源最短路径)
例题:蓝桥王国
题目描述
小明是蓝桥王国的王子,今天是他登基之日。
在即将成为国王之前,老国王给他出了道题,他想要考验小明是否有能力管理国家。
题目的内容如下:
蓝桥王国一共有 N 个建筑和 M 条单向道路,每条道路都连接着两个建筑,每个建筑都有自己编号,分别为 1∼N 。(其中皇宫的编号为 1)
国王想让小明回答从皇宫到每个建筑的最短路径是多少,但紧张的小明此时已经无法思考,请你编写程序帮助小明回答国王的考核。
输入描述
输入第一行包含三个正整数N,M。
第 2 到 M + 1 行每行包含三个正整数 u,v,w,表示 u→v 之间存在一条距离为 w 的路。
1≤N≤3×10^5,1≤m≤10^6,1≤ui,vi≤N,0≤wi≤10^9。
输出描述
输出仅一行,共 N 个数,分别表示从皇宫到编号为 1∼N 建筑的最短距离,两两之间用空格隔开。(如果无法到达则输出 -1)
输入输出样例
示例 1
输入
3 3 1 2 1 1 3 5 2 3 2
输出
0 1 3
1.用到bfs和优先队列,每次从未标记的点中,选择距离出发点最近的节点,标记。
2.计算队列中弹出节点a的临近节点b,如果节点b从经过a这条路走的距离小于原来的,更新b的距离,把b也加入队列中
3.如果弹出的节点是打过标记的节点,直接跳过,因为此节点到起点的最短路径已找到。
from queue import *
n,m=map(int,input().split())
vis