dijkstra 正确性证明

(最短路的子路也是最短路。)

算法过程

定义 S 为已确定最短路的点的集合;disi 存储当前从源点 1 到 i 的最短路径。

初始状态: dis1=0dis2..n= INF,S 为空。

  1. 在未确定最短路的点中选出 dis 值最小的点 k,将 k 加入 S 集合。
  2. 扩展 k。(扩展即为用 disk 更新与 k 相连的点的 dis 值)

重复 1、2 步骤,直到所有点都加入 S 集合。

正确性证明

已知:当前 S 中的节点都已进行扩展。
要证明:在未确定最短路的点中选出 dis 值最小的点 kdisk 就是源点到 k 的最短路。

证:
假设 disk 不为 k 的最短路,
k 的最短路径上找出第一个不在 S 中的点 pi, pik (一定有这样一个 piPathk:1-...-pi-...-k);1...k 长度(真正最短路) 1...p 长度(p 的最短路长度)
考察当前 dis[pi] 的值,由于“当前 S 中的节点都已进行扩展,dis[pi] 的值就是 pi 的最短路,dis[pi]<=dis[k]
如果 dis[pi]<dis[k] ,矛盾。
如果 dis[pi]=dis[k],可推出 dis[k] 为最短路,矛盾。

posted @   Jiayn  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示