最短路模板题,如果对最短路不是很熟悉的同学请移步:
传送门
进入正题
此题与其他题不同的是,每新增条边,就必须存储,然后等1操作到达时跑最短路,于是我们有 d i j k s t r a dijkstra dijkstra和 S P F A SPFA SPFA两种跑最短路的方法:
其次,如何处理无法到达呢。只需要 i f ( d i s [ ] = = i n f ) if(dis[]==inf) if(dis[]==inf)就行了。
因为我们 d i s dis dis一开始初始化为 i n f inf inf,如果在接下来的跑最短路中没有被更新(也就是 d i s = = i n f dis==inf dis==inf),说明由当前起点是到不了这个点的。
dinjkstra:
dijkstra的核心就在于它的算法步骤:
算法步骤:
1. 找离起点x最近的未讨论过的点k。
2. 判断经过k点,起点x到其他点的距离是否缩短,如缩短
则更新。将k点标记为已讨论。
3. 重复进行第1步,直到所有点都被讨论过为止。
所以dijkstra的实质是贪心,但是在上述步骤1中,我们可以使用强大的stl中的优先队列来快速查找。
所以dijkstra的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
c o d e code code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10005;
const ll inf=1e15