源码参见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 + 二者之间边的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);
}
3.用dfs逆向回溯路径: