
Dijkstra算法输出最短路径
发布日期:2021-05-07 22:04:58
浏览次数:12
分类:精选文章
本文共 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);}
通过上述方法,我们可以不仅找到最短距离,还能准确地重建路径,从而实现对最短路径的完整追踪和输出。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月12日 15时55分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
函数指针的典型应用-计算函数的定积分(矩形法思想)
2019-03-05
8051单片机(STC89C52)八个LED灯闪烁
2019-03-05
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
2019-03-05
基于8051实现的双倒计时器(Version1.0)
2019-03-05
ament: command not found ROS2
2019-03-05
双变量的t检验
2019-03-05
用 wxPython 打印你的 App
2019-03-05
wxPython:引用、展示图片、Stock IDs、操作剪切板、拖拽
2019-03-05
网页设计所需要的工具,各个岗位的职能,都在这里了
2019-03-05
android GPS JAVA 获取GPS功能是否禁用
2019-03-05
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
2019-03-05
Linux下安装MySql过程
2019-03-05
原生vue实现VantUI中IndexBar索引导航栏功能
2019-03-05
解决:android TextView上响应部分文字的事件
2019-03-05
android:使用audiotrack 类播放wav文件
2019-03-05
vue通过better-scroll 封装自定义的下拉刷新组件
2019-03-05
android解决:使用多线程和Handler同步更新UI
2019-03-05
vue自定义封装Loading组件
2019-03-05
解决移动端项目中苹果ios和安卓android手机点击输入框网页页面自动放大缩小
2019-03-05