最短路径、最短路径树和最小生成树

首先介绍这三个概念,很多人都听过最短路径了,但是最短路径树却很少听过,关于最短路径树的介绍也不太多。而最短路径树和最小生成树更是完全不同的两个概念。

       最短路径就是从一个指定的顶点出发,计算从该顶点出发到其他所有顶点的最短路径。通常用Dijkstra算法,Floyd算法求解。

       最短路径树SPT(Short Path Tree)是网络的源点到所有结点的最短路径构成的树。

       最小生成树是用和最少的边集将一个图连成任意2点可达,并且这个边集的总长度最小。保证整个拓扑图的所有路径之和最小。通常用Prim算法和kruskal算法求解。


       下面是最短路径树和最小生成树的对比图,原图来论文[1]。

原图:

对比图:

                           

                                                          最短路径树图                                    

 

 

     

                                                                      最小生成树图

        最短路径树的路径总长度为75,最小生成树的路径总长度为67.
 

最小生成树算法:

Prim方法

设N=(V,{E})是连通网,TE是N上最小生成树中边的集合:
(1)初始令U={u0},(u0属于V), TE=NULL
(2)在所有u属于U,v属于V-U的边(u,v)属于E中,找一条代价最小的边(u0,v0)
(3)将(u0,v0)并入集合TE,同时v0并入U
(4)重复上述操作直至U=V为止,则T=(V,{TE})为N的最小生成树


Kruskal算法

设连通网N=(V,{E}),令最小生成树
(1)初始状态为只有n个顶点而无边的非连通图T=(V,{NULL}),每个顶点自成一个连通分量
(2)在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边
(3)依此类推,直至T中所有顶点都在同一连通分量上为止

 

最短路径算法:

最短路径:路径上所有边的权值之和最小。

某顶点到其它个点的最短路径
Dijkstra算法:

(1)初使时令 S={V0},T={其余顶点},T中顶点对应的距离值
(2)若存在<V0,Vi>,为<V0,Vi>弧上的权值
(3)若不存在<V0,Vi>,为无穷
(4)从T中选取一个其距离值为最小的顶点W,加入S
(5)对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值
(6)重复上述步骤,直到S中包含所有顶点,即S=V为止

每对顶点之间的最短路径
Floyd算法:

(1)初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为无穷
(2)逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值
(3)所有顶点试探完毕,算法结束