跳至主要內容- 初始化一个 n×n 的距离矩阵 dist,其中 disti,j 表示顶点 i 到顶点 j 的初始距离:
- 若 i=j,则 disti,j=0;
- 若顶点 i 和 j 之间有直接边,disti,j 设为边的权重;
- 否则,disti,j=∞(无穷大)。
- 遍历所有中间顶点 k(从 1 到 n):
- 遍历所有起点 i(从 1 到 n):
- 遍历所有终点 j(从 1 到 n):
- 如果 disti,j>disti,k+distk,j,则更新 disti,j=disti,k+distk,j。
- 算法结束后,disti,j 即为顶点 i 到顶点 j 的最短路径距离。
- 给定起点 s,初始化距离数组 dist:dists=0,其他顶点 disti=∞;初始化一个标记数组 visited,所有元素为 false(表示未访问)。
- 执行 n 次循环(n 为顶点数):
- 在未访问的顶点中,找到距离起点最近的顶点 u(即 distu 最小且 visitedu=false)。
- 标记 u 为已访问(visitedu=true)。
- 遍历 u 的所有邻接顶点 v:
- 如果 distv>distu+边(u,v)的权重,则更新 distv=distu+边(u,v)的权重。
- 算法结束后,disti 即为起点 s 到顶点 i 的最短路径距离。
- 给定起点 s,初始化距离数组 dist:dists=0,其他顶点 disti=∞;使用一个优先队列(小根堆),存储 (距离,顶点) 对,初始将 (0,s) 入堆。
- 当 优先队列不为空 时:
- 弹出堆顶元素 (current_dist,u)(即当前距离起点最近的顶点 u)。
- 如果 current_dist>distu,则跳过该顶点(已处理过更优路径)。
- 遍历 u 的所有邻接顶点 v:
- 计算新距离 new_dist=distu+边(u,v)的权重。
- 如果 new_dist<distv:
- 更新 distv=new_dist。
- 将 (new_dist,v) 入堆。
- 算法结束后,disti 即为起点 s 到顶点 i 的最短路径距离。
- 给定起点 s,初始化距离数组 dist:dists=0,其他顶点 disti=∞。
- 执行 n−1 次循环(n 为顶点数):
- 遍历所有边 (u,v):
- 如果 distu=∞ 且 distv>distu+边(u,v)的权重,则更新 distv=distu+边(u,v)的权重。
- 检测负权环:
- 再次遍历所有边 (u,v):
- 如果 distu=∞ 且 distv>distu+边(u,v)的权重,则说明图中存在负权环,无法计算最短路径。
- 若不存在负权环,disti 即为起点 s 到顶点 i 的最短路径距离。
- 给定起点 s,初始化距离数组 dist:dists=0,其他顶点 disti=∞;使用一个队列存储待松弛的顶点,初始将 s 入队;初始化一个入队次数数组 cnt,cnts=1,其他为 0。
- 当 队列不为空 时:
- 出队顶点 u。
- 遍历 u 的所有邻接顶点 v:
- 计算新距离 new_dist=distu+边(u,v)的权重。
- 如果 new_dist<distv:
- 更新 distv=new_dist。
- 如果 v 不在队列中:
- 将 v 入队。
- cntv+=1。
- 如果 cntv≥n(n 为顶点数),则说明存在负权环,算法终止。
- 若未检测到负权环,disti 即为起点 s 到顶点 i 的最短路径距离。