本文摘自PHP中文网,作者little bottle,侵删。
网络层的链路状态路由选择算法(LS算法),其中一种就是用Dijkstra算法写的。《算法导论》的介绍:Dijkstra算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有边的权重都为非负值。
算法思路
- G集表示所有点集,S集表示已经求解出源到某点的最短路径的点集,V集表示为求出最短路径的点集
- 首先令S=?,V=G
如图所示6个点8条边 V={1,2,3,4,5,6}
- 取u=1,把点1放入S中,S={1} ,V={2,3,4,5,6},遍历与点1相连的点,并把权值放入数组
4.由路径数组可得知此时V集中 点2有最短路径(值为3)所以令u=2,则S={1,2} ,V={3,4,5,6}
因为dis[3]=dis[2]+4 ? 7=3+4
… . dis[5]=dis[2]+9 ? 12=3+9
- 同理如今S={1,2},V={3,4,5,6},在V中发现dis[3]为除dis[1],dis[2]外的最小值,所以令S=S∪{3}
此时S={1,2,3},V={4,5,6}
因为dis[5]=12>dis[3]+1=7+1 ? 令 dis[5]=dis[3]+1=7+1=8
因为dis[6]=∞ >dis[3]+6=7+6 ? 令 dis[6]=dis[6]+6=7+6=13
- 同理如今S={1,2,3},V={4,5,6},在V中发现dis[4]为除dis[1],dis[2],dis[3]外的最小值,所以令S=S∪{4}
此时S={1,2,3,4},V={5,6}
因为dis[6]=13>dis[4]+7=5+7 ? 令 dis[6]=dis[4]+7=5+7=12
- 同理如今S={1,2,3,4},V={5,6},在V中发现dis[5]为除dis[1],dis[2],dis[3],dis[4]外的最小值,所以令S=S∪{5}
此时S={1,2,3,4,5},V={6}
因为dis[6]=12>dis[5]+2=8+2 ? 令 dis[6]=dis[5]+2=8+2=10
如上从点1到各个点的最短路径就求出来,感觉最近写的很乱,不容易看懂。不过感谢各位看官能够看到这儿。
关于n点m条边求最短路径,一般迭代n次就能得出所有点的最短路径。
现在就是贴出代码惹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
|
【推荐课程:C++视频教程】
以上就是用C++实现最短路径之Dijkstra算法的详细内容!
相关阅读 >>
(C++)错误的map删除操作和stl中容器的迭代器的底层实现机制
更多相关阅读请进入《C++》频道 >>