朴素邻接矩阵版Dijkstra求最短路
[AcWing.849. Dijkstra求最短路 I]
给定一个 n
个点 m
条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出 1
号点到 n
号点的最短距离,如果无法从 1
号点走到 n
号点,则输出 -1
。
输入格式
第一行包含整数 n
和 m
。
接下来 m
行每行包含三个整数 x,y,z
,表示存在一条从点 x
到点 y
的有向边,边长为 z
。
输出格式
输出一个整数,表示 1
号点到 n
号点的最短距离。
如果路径不存在,则输出 -1
。
数据范围
1 < n < 500
,1 < m < 10^5
,
图中涉及边长均不超过10000。
输入样例:
1 |
|
输出样例:
1 |
|
算法思想
朴素Dijkstra
可以用来求有向图
的单源最短路
(一个点到其余点的最短距离,一般默认是求起点1到其余点的距离),无向图
可以看作特殊的有向图
,只需要建图的时候建两条边
即可。
邻接矩阵
版,主要变量名解释:
1 |
|
易错点:
- main函数一开始
1
2// 很重要的一点!一开始就将邻接矩阵的距离都初始化为无穷大
memset(g, 0x3f, sizeof g); - dijkstra函数内一开始
1
2// 初始化源点距离数组为无穷大
memset(dist, 0x3f, sizeof dist); - dijkstra逻辑细节别都嵌套到for循环里面去了
1
2
3
4
5
6
7
8
9// 枚举所有点(这层循环要求点的编号也能对应上,从1开始)
for(int j = 1; j <= n; j++){
// 如果这个点还没有被纳入最短路集合里面
// t是-1,或者 有点j存在使得 有更短的路径
// 更新 t
if(!st[j] && (t == -1 || dist[j] < dist[t])){
t = j;
}
}1
2
3
4
5
6
7// 确定这个t点是最短路集合里面的点
st[t] = true;
// 由于t这个点加入,需要更新一下距离
for(int j = 1; j <= n; j++){
// g[t][j]是边权
dist[j] = min(dist[j], dist[t] + g[t][j]);
}
代码实现
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Phbeats-Blog!
评论