四种最短路算法的比较
最短路
最短路,顾名思义,最短的路径。
我们把边带有权值的图称为带权图。边的权值可以理解为两点之间的距离。一张图中任意两点之间会有不同的路径相连。最短路径就是指连接两点的这些路径中最短的一条。
我们有四种算法可以有效地解决最短路径问题,但是当出现负边权时,有些算法不适用。
稠密图与稀疏图
有很少条边或弧(边的条数|E|远小于|V|²)的图称为稀疏图(sparse graph),反之边的条数|E|接近|V|²,称为稠密图(dense graph)。——摘自《百度百科》
依个人理解,相对于图中的点,边数较少的称为稀疏图,边数较多的称为稠密图。
由于各种算法对边和点的处理不尽相同,所以我们可以根据图的不同来选择不同的建图方式与最短路算法。
单源最短路径算法与多源最短路径算法
单源最短路径算法是用来计算从一个点到其他所有点的最短路径算法;
多源最短路径算法是用来计算任意两点之间的最短路径算法。
以下若无特别说明,dis[i][j]代表从i到j的最短路径,w[i][j]代表连接i,j的边的长度。
Floyed-Warshall算法 O(N^3)
分类:
多源最短路径算法。
作用:
1.求最短路。 2.判断一张图中的两点是否相连。
优点:
实现极为简单
缺点:
只有数据规模较小且时空复杂度都允许时才可以使用(NOIP上大概不会放出来的吧)。
思想:
3层循环,第一层枚举中间点k,第二层与第三层枚举两个端点i,j。若有dis[i][j] > dis[i][k] + dis[k][j] 则把dis[i][j]更新成dis[i][k] + dis[k][j](原理还是很好理解的)。
实现:
(a)初始化:点i,j如果有边相连,则dis[i][j] = w[i][j]。如果不相连,则dis[i][j] = 0x7fffffff(int极限值),表示两点不相连(或认为相隔很远)。
(b)算法代码:
for(int k = 1; k <= n; k++) //枚举中间点(必须放最外层)
for(int i = 1; i <= n; i++) //枚举端点i
if