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

来源:互联网 发布:二维码扫描软件ios 编辑:程序博客网 时间:2024/06/06 18:00

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

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

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

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

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

//两个if完成松弛操作if ((it.second->costTillNow + iter.second) < relaxMap[iter.first]->costTillNow) {relaxMap[iter.first]->costTillNow = it.second->costTillNow + iter.second;//松弛节点,下一个节点的costTillNow = 当前节点的costTillNow + 二者之间边的costrelaxMap[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);}




3.用dfs逆向回溯路径:


0 0