Dijkstra算法——点对多点
Bellman-Ford算法——点对多点
Floyd-Warshall算法——多点对多点
D算法
D算法把端集分为两组,一组称为置定端集Gp,另一组称为未置定端集G-Gp。
每端都逐步给予一个标值。
对于置定端,标值是vs到该端的最短径的长度;
对于未置定端,所标的值是暂时的,随着算法的进展而调整。
D算法的适用范围
D算法对有向图也适用
也可适用于端点有权的情况
D算法不适用于边的权有正有负的情况
BF算法
Bellman-Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题。对于给定的带权(有向或无向)图 G=(V,E),其源点为s,加权函数 w是 边集 E 的映射。对图G运行Bellman-Ford算法的结果是一个布尔值,表明图中是否存在着一个从源点s可达的负权回路。若不存在这样的回路,算法将给出从源点s到 图G的任意顶点v的最短路径d(vs,vj)=min{d(vs,vi)+wij}
判断:如果存在从源点可达的权为负的回路,就无法收敛,不满足公式 d(v) < d (u) + w(u,v)。
Bellman-Ford算法的迭代松弛操作,实际上就是按顶点距离s的层次,逐层生成这棵最短路径树的过程。
B-F算法的运算量
设有N个节点, B-F算法最多循环N次;每次循环处理N-1个节点;对每个节点求最小路径,有N-1种选择;
最坏情况下计算量为N的立方,表示为O(N的立方)
F算法
弗洛埃德(Floyd)算法,简称F算法。
F算法与D算法原理是一样的,只是用矩阵形式来表达,并进行系统化的计算。
对于n个端,已给边长dij的图,顺序计算各个n×n的W阵和R阵,前者代表径长,后者代表转接路由。
F算法步骤如下:
F0:
文字描述:定义径长矩阵与转接路由矩阵
径长矩阵:有边就为端点之间距离 无边就为无穷大 端点为本身就为0
转接路由矩阵:如果径长矩阵有边,r就为j
F1:已得W(k-1)和R(k-1),求W(k)和R(k)
文字描述:
从第1个端点到最后一个端点依次作为两两端点中间端点,求径长及转接路由
规则:
径长矩阵:比较之前矩阵与现在加了端点后的矩阵,取小值(我们可以看着矩阵来进行计算)
转接路由:如果加了端点后的径长与之前相同,那r就取r(k-1)矩阵j列
如果加了端点后的径长小于之前的,就取之前r(k-1)矩阵k列
F2:k<n,重复F1;k=n,终止。
我们可以通过矩阵找两个端点之间的最小路径
评价:
1D算法与P算法很相近,都是分为置定端集与未置顶端集,来进行计算,只是D算法求最短经相比P算法求最短主树多了更新这个操作
2F算法,就是n行n列不断更新相加,来找最短径,注意最开始径长与转接路由设定:两个端没相邻,前者为∞,后者为0;重合的话两者都为0,即斜线为0