博客
关于我
C++实现Dijkstra算法(单源路径最短算法)
阅读量:356 次
发布时间:2019-03-04

本文共 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,其他顶点的距离为无穷大;通过不断地更新和选择当前最短路径的顶点,最终得到源点到其余顶点的最短路径。

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

你可能感兴趣的文章
SQL Server SQL语句调优技巧
查看>>
用C#实现封装-徐新帅-专题视频课程
查看>>
C语言学习从初级到精通的疯狂实战教程-徐新帅-专题视频课程
查看>>
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
查看>>
NAT工作原理
查看>>
Processes, threads and goroutines
查看>>
c++中的10种常见继承
查看>>
语义化版本编号(Semantic Versioning)
查看>>
E28 LoRa模块透传 定点传输 RSSI测试与MicroPython应用
查看>>
成功解决Keil MDK5中no browse information available in ‘xxx’的问题
查看>>
抽离css文件
查看>>
babel预设、插件和webpack中运行
查看>>
Vue学习—深入剖析渲染函数
查看>>
Vue学习—深入剖析函数式组件
查看>>
基于selenium的分布式爬虫-微浏览器
查看>>
网络编程一 tcp的一些信号处理
查看>>
简单Makefile的编写
查看>>
使用BAT批处理 匹配查找指定文件夹,并在当文件夹下创建空文件
查看>>
VS2017运行任意多线程的c++程序,VS2017闪退问题
查看>>
wxpython的Hello,World代码探索
查看>>