
C++实现Dijkstra算法(单源路径最短算法)
发布日期:2021-05-07 22:04:57
浏览次数:12
分类:精选文章
本文共 1465 字,大约阅读时间需要 4 分钟。
Dijkstra算法是用来在有向图中找到一个顶点到其余顶点的最短路径的算法。它的基本思想是通过不断地更新源点到其余顶点的最短路径,逐步找到所有顶点的最短路径。
Dijkstra算法的主要操作可以分为两步:第一步是从源点出发,选取当前到达其余顶点路径最短的那个顶点并加入已处理的集合中;第二步是每次选取一个顶点后,都要更新源点到其余顶点的最短路径,因为加入新的顶点可能会提供更短的路径。
与Prim算法相比,Dijkstra算法的核心思想在于记录的是源点到其余顶点的最短路径,而Prim算法记录的是其余顶点到当前顶点的最短路径。这种区别导致了两个算法在实现时的细节差异。
下面我们来看一个具体的例子。假设顶点0是源点,首先会选取与顶点0相连的顶点进行比较。由于之前这些顶点的最短路径都是未知的(如1、3、4),所以会更新它们的最短路径距离。接着,选出路径最短的顶点(通常是1),并更新其余顶点的最短路径。重复这个过程直到所有顶点的最短路径都被确定。
以下是用C语言实现的Dijkstra算法代码示例:
#include#include #include using namespace std;void Dijkstra(int n, int s, int G[n][n]) { int d[n]; bool vis[n]; fill(d, d + n, INF); d[s] = 0; vis[s] = true; for(int i = 0; i < n; i++) { int u = -1; int min_dist = INF; for(int j = 0; j < n; j++) { if(!vis[j] && d[j] < min_dist) { u = j; min_dist = d[j]; } } if(u == -1) break; 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]; } } }}int main() { int n, m, s; cin >> n >> m >> s; int G[n][n] = {INF}; for(int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; G[u][v] = w; } Dijkstra(n, s, G); for(int i = 0; i < n; i++) { cout << d[i] << " "; }}
这个代码实现了Dijkstra算法的主要逻辑:初始化源点的距离为0,其他顶点的距离为无穷大;通过不断地更新和选择当前最短路径的顶点,最终得到源点到其余顶点的最短路径。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月30日 00时28分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
pythonBug入门——从零开始学python
2019-03-04
js-禁止右键菜单代码、禁止复制粘贴代码
2019-03-04
SpringBoot中使用Mybatis访问MySQL数据库(使用xml方式)
2019-03-04
SSLOJ1692 USACO 3.2 Magic Squares 魔板&P2730
2019-03-04
暴打算法:王者级数据结构与LeetCode笔记,一路绿灯杀进字节Java岗
2019-03-04
数组--Go语言学习笔记
2019-03-04
Redis (三)——Linux 上安装 Redis
2019-03-04
java 重写(override)和重载(overload)区别
2019-03-04
java 多态
2019-03-04
java 多态类型转换
2019-03-04
java ==和equals
2019-03-04
常用正则表达式
2019-03-04
C#中换行的代码
2019-03-04
用正则表达式过滤多余空格
2019-03-04
XML:采用XHTML和CSS设计可重用可换肤的WEB站点
2019-03-04
泳道图简介
2019-03-04
Tomcat6中web项目部署路径webapps和wtpwebapps的区别
2019-03-04
Java判断字符串是否为金额
2019-03-04
Kubernetes十三--Pod定义文件内容详解
2019-03-04
普歌- LRF-(简单易懂)笔记本电脑USB接口案例 接口多态(向下转型)
2019-03-04