dijkstra求多条最短路径(附源码)

源码参见github:https://github.com/silenceMg/multiShortestPath

手绘了半天图实在是没精力对dijkstra做基本介绍了,本文默认大家对dijkstra已经有了基本的了解。然后就是看图说话了:

1.原始的图,圆圈中的数字代表节点编号

《dijkstra求多条最短路径(附源码)》

2.接下来是多条最短路径dijkstra算法的运行过程图解,圆圈中第一个数字是走到当前节点时花费的cost总和,代码中记为costTillNow,后面括号中的数表示当前节点的所有前向节点(大家比照着上面的原图看,这里因为空间原因不能给每个节点标号了)。绿色多边形表示集合S,绿色多边形之外的节点表示优先队列中的节点,整个dijkstra就是把队列中的节点pop到集合S中的过程。测试用例附在源代码中。

《dijkstra求多条最短路径(附源码)》《dijkstra求多条最短路径(附源码)》《dijkstra求多条最短路径(附源码)》《dijkstra求多条最短路径(附源码)》

打红叉的地方表示这条边加上4 > 6, 所以不会走这条边,体现在源代码中就是:

//两个if完成松弛操作
if ((it.second->costTillNow + iter.second) < relaxMap[iter.first]->costTillNow) {
	relaxMap[iter.first]->costTillNow = it.second->costTillNow + iter.second;//松弛节点,下一个节点的costTillNow = 当前节点的costTillNow + 二者之间边的cost
	relaxMap[iter.first]->prev.clear();
	relaxMap[iter.first]->prev.push_back(it.first);//指向前节点,记录路径,这里是求多条路径的关键点,用vector来存储多个前向节点
} else if ((it.second->costTillNow + iter.second )== relaxMap[iter.first]->costTillNow) {
	relaxMap[iter.first]->prev.push_back(it.first);
}

《dijkstra求多条最短路径(附源码)》《dijkstra求多条最短路径(附源码)》

3.用dfs逆向回溯路径:

《dijkstra求多条最短路径(附源码)》《dijkstra求多条最短路径(附源码)》《dijkstra求多条最短路径(附源码)》《dijkstra求多条最短路径(附源码)》

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/popvip44/article/details/53054705
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞