朴素dijkstra算法
最短路问题
朴素 dijkstra 算法 —— 模板题 AcWing 849. Dijkstra 求最短路 I
题解
时间复杂是 O(n2+m)O(n2+m), n 表示点数,m 表示边数 1.用一个 dist 数组保存源点到其余各个节点的距离,dist[i] 表示源点到节点 i 的距离。初始时,dist 数组的各个元素为无穷大。
用一个状态数组 state 记录是否找到了源点到该节点的最短距离,state[i] 如果为真,则表示找到了源点到节点 i 的最短距离,state[i] 如果为假,则表示源点到节点 i 的最短距离还没有找到。初始时,state 各个元素为假。
2.源点到源点的距离为 0。即 dist[1] = 0。 3.遍历 dist 数组,找到一个节点,这个节点是:没有确定最短路径的节点中距离源点最近的点。假设该节点编号为 i。此时就找到了源点到该节点的最短距离,state[i] 置为 1。
4.遍历 i 所有可以到达的节点 j,如果 dist[j] 大于 dist[i] 加上 i -> j 的距离,即 dist[j] > dist[i] + w[i][j](w[i][j] 为 i -> j 的距离) ,则更新 dist[j] = dist[i] + w[i][j]。
5.重复 3 4 步骤,直到所有节点的状态都被置为 1。
此时 dist 数组中,就保存了源点到其余各个节点的最短距离。
1 | int g[N][N]; // 存储每条边 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 向南!
评论