博客
关于我
Dijkstra算法输出最短路径
阅读量:356 次
发布时间:2019-03-04

本文共 1664 字,大约阅读时间需要 5 分钟。

Dijstra算法不仅可以计算源点到各个顶点的最短距离,还可以记录从源点到达每个顶点的最短路径的前驱节点。以下是详细说明:

  • 理解前驱节点的概念

    在Dijstra算法中,我们通常使用一个数组pre来记录每个顶点在最短路径中的前驱节点。pre[v]表示顶点v在最短路径中被访问之前所经过的那个顶点。

  • 构造完整路径

    通过递归访问pre数组,可以从目标顶点一步步追溯回源点,从而得到完整的最短路径。例如,假设pre[4] = 3,那么顶点4的前驱是顶点3;继续查询pre[3] = 2,顶点3的前驱是顶点2;再查询pre[2] = 1,顶点2的前驱是顶点1。通过这种方式,可以逐步构造出完整的路径。

  • 代码实现说明

    代码主要包含以下几个部分:

    • 初始化部分:将每个顶点的前驱设置为自己。
    • 输入部分:读取图的边权信息并初始化邻接矩阵。
    • Dijstra算法核心:使用优先队列实现最短路径计算,同时更新pre数组记录前驱节点。
    • 路径输出部分:通过递归函数从目标顶点追溯回源点,输出完整路径。
  • 代码示例

    以下是代码的主要部分:

    #include 
    #include
    #include
    using namespace std;int n, m, s, G[maxSize][maxSize];int d[maxSize];bool vis[maxSize] = {false};int pre[maxSize];void Dijstra(int s) { fill(d, d + maxSize, INF); d[s] = 0; for (int i = 0; i < n; ++i) { int u = -1, min = INF; for (int j = 0; j < n; ++j) { if (!vis[j] && d[j] < min) { u = j; min = d[j]; } } if (u == -1) return; vis[u] = true; for (int v = 0; v < n; ++v) { if (!vis[v] && G[u][v] != INF && d[u] + G[u][v] < d[v]) { d[v] = d[u] + G[u][v]; pre[v] = u; } } }}void shortPath(int s, int v) { if (s == v) { return; } shortPath(s, pre[v]); cout << v << " ";}int main() { // 初始化前驱数组 for (int i = 0; i < n; ++i) { pre[i] = i; } // 读取输入并初始化邻接矩阵 for (int i = 0; i < m; ++i) { int u, v, w; cin >> u >> v >> w; G[u][v] = w; } Dijstra(s); // 输出最短距离 for (int i = 0; i < n; ++i) { cout << d[i] << " "; } // 输出最短路径 shortPath(s, v);}
  • 通过上述方法,我们可以不仅找到最短距离,还能准确地重建路径,从而实现对最短路径的完整追踪和输出。

    转载地址:http://urwg.baihongyu.com/

    你可能感兴趣的文章
    趣谈文件扩展名和隐藏文件
    查看>>
    数学建模(NO.18灰色预测)
    查看>>
    数学建模更新12(数学线性规划模型1)
    查看>>
    Android,SharedPreferences的使用
    查看>>
    VLAN与Trunk的原理及配置
    查看>>
    三层交换技术及配置
    查看>>
    华为hybrid vlan配置
    查看>>
    OSPF路由重分发配置实例
    查看>>
    VS中使用c++函数显示找不到标识符
    查看>>
    JPEG压缩技术
    查看>>
    《C++ Concurrency in Action》读书笔记四 c++内存模型和原子类型
    查看>>
    Leetcode No.104 Maximum Depth of Binary Tree 遍历二叉树的深度
    查看>>
    开发基于MFC的ActiveX控件的时候的一些消息处理
    查看>>
    一个C/C++ 命令行参数处理的程序
    查看>>
    两款用于检测内存泄漏的软件
    查看>>
    王爽 《汇编语言》 读书笔记 三 寄存器(内存访问)
    查看>>
    IDEA出现问题:Received fatal alert: protocol_version 解决方案
    查看>>
    docker出现问题:You cannot remove a running container 解决方案
    查看>>
    IDEA 热部署太热情不好(失去焦点就热部署)
    查看>>
    访问docker中的nginx容器部署
    查看>>