当前位置: 首页 > java >正文

深入理解 Dijkstra 算法:原理、实现与优化

算法核心思想

Dijkstra算法采用贪心策略,其核心思想可以概括为:

  1. 初始化:设置起点到自身的距离为0,到其他所有点的距离为无穷大

  2. 迭代处理

    • 从未处理的顶点中选择当前距离起点最近的顶点

    • 标记该顶点为已处理

    • 通过该顶点更新其邻居顶点的距离

  3. 终止条件:所有顶点都被处理过

算法实现详解

数据结构准备

我们使用以下数据结构:

2. 主循环(进行 n-1 次,每次确定一个节点的最短路径)

初始状态:


第一次循环(i=1):


第二次循环(i=2):


第三次循环(i=3):

3. 最终结果


代码问题修正

你的代码有一个小问题:

cpp

复制

下载

int t = -1;  // 初始化为 -1
for (int j = 1; j <= n; j++)if (!st[j] && (t == -1 || d[j] < d[t]))t = j;
if (t == -1) break;  // 所有节点已处理或不可达

图解流程

初始 d: [0, INF, INF]
第一次循环(t=1):- 更新 d[2]=2, d[3]=4 → d: [0, 2, 4]
第二次循环(t=2):- 更新 d[3]=3 → d: [0, 2, 3]
最终结果:d[3] = 3

  • g[N][N]:邻接矩阵存储图的边权

  • d[N]:存储从起点到各顶点的最短距离

  • st[N]:标记顶点是否已被处理

  • 我们以下面的图为例:

    3 3       // 3个节点,3条边
    1 2 2     // 边 1→2,权重=2
    2 3 1     // 边 2→3,权重=1
    1 3 4     // 边 1→3,权重=4
    1. 初始化
  • g[N][N](邻接矩阵)初始化为 0x3f3f3f3fINF)。

  • 输入边后,g 变为:

    g[1][2] = 2
    g[2][3] = 1
    g[1][3] = 4
    其余 g[i][j] = INF
  • d[N](最短距离数组)初始化为 INF,然后 d[1] = 0(起点到自身距离为0)。

  • st[N](标记数组)初始化为 0(未处理)。

  • d = [0, INF, INF]

  • st = [0, 0, 0]

  • 找未处理的最近节点 t

    • j=1d[1]=0st[1]=0 → t=1

    • j=2d[2]=INF > d[1],不更新 t

    • j=3d[3]=INF > d[1],不更新 t

    • 最终 t=1(节点1)。

  • 标记 st[1] = 1(已处理)。

  • 用节点1更新邻居:

    • j=2d[1] + g[1][2] = 0 + 2 < INF → d[2] = 2

    • j=3d[1] + g[1][3] = 0 + 4 < INF → d[3] = 4

    • 更新后 d = [0, 2, 4]

  • 找未处理的最近节点 t

    • j=1st[1]=1(已处理,跳过)

    • j=2d[2]=2st[2]=0 → t=2

    • j=3d[3]=4 > d[2],不更新 t

    • 最终 t=2(节点2)。

  • 标记 st[2] = 1(已处理)。

  • 用节点2更新邻居:

    • j=3d[2] + g[2][3] = 2 + 1 = 3 < 4 → d[3] = 3

    • 更新后 d = [0, 2, 3]

  • 虽然循环条件是 i < n(即 i=1, 2),但你的代码中 i 从 1 到 n-1(共 n-1=2 次),所以不会执行第三次循环。

  • d = [0, 2, 3],所以 d[n] = d[3] = 3

  • 输出 3(即 1→2→3 的路径,权重 2+1=3,比直接 1→3 的 4 更短)。

  • t 的初始值应为 -1 而不是 0,因为节点编号从 1 开始,t=0 可能导致逻辑错误(如果所有 d[j]=INFt 会保持 0,而 g[t][j] 会访问 g[0][j],越界)。
    修正:

http://www.xdnf.cn/news/6264.html

相关文章:

  • 【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务
  • 数字信号处理-大实验1.3
  • 为什么我不能获取到镜像,ImagePullBackoff
  • 观测云:从云时代走向AI时代
  • 二叉树(中序遍历)
  • 海信璀璨505U6真空冰箱闪耀“国家德比”
  • 从零开始完成“大模型在牙科诊所青少年拉新系统中RAG与ReACT功能实现”的路线图
  • 【Python】对象生命周期全解析
  • 【Python-Day 13】Python 元组 (Tuple) 详解:从创建、操作到高级应用场景一网打尽
  • springboot AOP 接口限流(基于IP的接口限流和黑白名单)
  • 万字解析:Java字符串
  • vue3基础学习(上) [简单标签] (vscode)
  • “redis 目标计算机积极拒绝,无法连接” 解决方法,每次开机启动redis
  • 图表制作-基础饼图
  • Nightingale监控系统介绍与部署(可离线部署)
  • sql server 2019 将单用户状态修改为多用户状态
  • map和unordered_map
  • 七部门:设立“国家创业投资引导基金”,优先支持取得关键核心技术突破的科技型企业上市融资
  • libmemcached库api接口讲解零
  • 使用frp实现客户端开机自启(含静默运行脚本)
  • IEEE PRMVAI 2025 “人工智能的应用“分论坛
  • 在 Rocky Linux 上手动安装 zsh
  • 龙虎榜——20250514
  • Postman接口测试
  • 操作系统实验 实验4 页面置换算法
  • python库sqlalchemy
  • 现代计算机图形学Games101入门笔记(八)
  • K8S redis 部署
  • 火线、零线、地线
  • 【HALCON】 HALCON 教程:正确使用 `get_dict_tuple` 获取字典内容