最短路径算法综述
最短路径算法综述
更新中。。。。
1.单源最短路径问题
涵义:从给定的源顶点s到每个顶点v的最短路径。
在弄清楚如何求算单源最短路径问题之前,必须弄掌握几点知识。
最短路径的最优子结构 最短路径算法通常依赖于一种性质,也就是一条两顶点之间的最短路径包含路径上其他的最短路径。这种最优子结构性质是动态规划和贪心算法是否适用的一个标记。Dijkstra算法是一个贪心算法,而找出所有顶点对之间的最短路径的Floyd_Warshall算法是一个动态规划算法。下面的引理更加准确地陈述了最短路径的最优子结构的性质。
引理1(最短路径的子路径是最短路径) 证明略,请参考《算法导论》P358
负权值边:单源最短路径的某些示例中,可能存在权值为负值的边。但是不可能存在负权回路。Dijkstra不能处理负权值的图,Bellman-Ford能处理。
回路:最短路径上不可能有回路。
最短路径的表示:已知图G=(V,E),对于每个顶点v∈V,设置其前驱(predecessor)顶点∏(v)为另一顶点或NIL。通过这种方法,就可以使用PRINT-PATH(G,s,v)函数来打印路径。
松弛技术(relaxation):对于每个顶点设置一个属性的d[v]来描述从源点s到v的最短路径上权值的上界。具体请参考《算法导论》P360
最短路径以及松弛的性质:三角不等式、上界性质、无路径性质、收敛性质、路径松弛性质、前驱子图性质等等。具体请参考《算法导论》P361
问题的3个变体:
♠.单终点最短路径
♠.单对顶点最短路径
♠.每对顶点间最短路径
2.Bellman-Ford算法分析与实现(C/C++)
http://www.wutianqi.com/?p=1912
3.Dijkstra算法分析与实现(C/C++)
http://www.cnblogs.com/panweishadow/p/3396001.html
4.SPFA(Shortest Path Faster Algorithm)算法分析与实现(C/C++)
http://www.wutianqi.com/?p=2285
感谢Tanky Woo大神的博客,他的算法专题链接:http://www.wutianqi.com/sfzt.html