博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dijkstra单源最短路算法的C++实现
阅读量:4352 次
发布时间:2019-06-07

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

这是一个简易的Dijkstra算法的优化实现,利用了堆,这里使用C++中的优先级队列。利用STL内置的堆实现只是优化的第一步,更进一步的优化包括使用Fibonacci堆等更高级数据结构。

算法中,使用邻接表作为存储图的数据结构,利用一个int数组d保存过程中及最后得到的最短路长度,再自定义一个pair<int, int>来保存在堆中的当前最短路,pair的first元素用来保存路径长度,second元素保存所对应的节点数。堆以first的值作为比较元素,通过second值得到其节点索引,再到邻接表中查找出边,将所有出边relax掉(也就是更新d中的最短距离)。直到队列为空,停止算法。

这个Dijkstra算法不是那么容易说清楚的。在众多算法中,个人感觉这个算法在实现上逻辑比较复杂(关乎实现)。算法本身很直观,但因为涉及到图,其各种操作都要退化到程序中迭代实现,比起堆排序、快排、KMP等算法,需要一些新的编程技巧和思维习惯。

Talk is cheap, show you the code.

 

struct Edge{ int to, cost; };typedef pair
P;const int M = 10;const int V = 10;const int INF = 1 << 30;vector
E[M];int d[V];void dij(int s,int t){ fill(d, d + V, INF); d[s] = 0; priority_queue

, greater

> q; q.push(P(0, s)); while(!q.empty()){ P p = q.top(); q.pop(); int to = p.second; int cost = p.first; for (int i = 0; i < E[to].size(); i++) { Edge e = E[to][i]; if (d[e.to]>d[to] + e.cost) { d[e.to] = d[to] + e.cost; q.push(P(d[e.to], e.to)); } } }}

  

转载于:https://www.cnblogs.com/xlert/p/3963170.html

你可能感兴趣的文章
mysql的数据存储
查看>>
[转载] Activiti Tenant Id 字段释疑
查看>>
[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
查看>>
SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能
查看>>
最小权限的挑战
查看>>
jquery 视觉特效(水平滚动图片)
查看>>
SVG笔记
查看>>
linux下使用dd命令写入镜像文件到u盘
查看>>
001---进程
查看>>
视频人脸检测——OpenCV版(三)
查看>>
php获取来访者在搜索引擎搜索某个关键词,进入网站
查看>>
物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息
查看>>
2018-2019-1 20165234 20165236 实验二 固件程序设计
查看>>
IDEA的GUI连接数据库写入SQL语句的问题总结
查看>>
Xpath在选择器中正确,在代码中返回的是空列表问题
查看>>
leecode第一百九十八题(打家劫舍)
查看>>
【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
查看>>
07-3. 数素数 (20)
查看>>
写一个欢迎页node统计接口Py脚本(邮件,附件)-py
查看>>
计算两个日期之间的天数
查看>>