在在一个带权图中,从某一个单源节点,走到其他节点,如何求得所有路径中的最短路径,是单元节点最短路径问题。而在路由算法中,与此类似,可以抽象出该模型来。迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Floyd算法,是另一个求最短路径的经典算法,不同于Dijikstra算法,是求带全图中每一对节点之间的最短路径。这两个算法所针对的带全图既可以是有向图,也可以是无向图。本文在迪杰斯特拉算法和Floyd算法的基础上,通过C语言程序,构建一个无向带权图,以程序的方式来验证最短路径路由算法。从而提供两种解决最短路径路由的思路。
1带全图相关知识介绍
图是数据结构中的一种数据组织方式,由节点和边构成,其中边既可以是有向边,也可以是无向边。图中的边为有向边的图叫有向图,图中边为无向边的图叫无向图。本文所探讨的两种最短路劲算法,既可以用于解决有向图,也可以用于解决无向图。如下图1所示,是一个含有五个节点的带权无向图。
在该图中,拥有五个节点,七条边,每一条边上的数字代表该边的权重,它可以代表距离、耗费、时间或其他意义。在路由算法中,即可以代表两个路由节点之间的路径长度和耗费,因此通过路由算法,选择一条花费最短的路径,具有积极的作用。
2迪杰斯特拉算法原理简介
Dijikstra算法是典型的求单源节点到其他节点的最短路径算法。[12]其基本思想是,通过构建一个节点之间的邻接矩阵来表示节点之间的路径长度。假设我们需要求得是节点v到其他节点的最短路径,在最开始初始化v到其他节点的距离,当v与其他节点之间存在路径的时候,即将该节点之间的路径长度赋为该路径长度的权值,如果v到某个节点之间不存在直接路径,则将v到该节点的权值赋为无穷大(在程序中使用一个较大的数值来代表无穷大)。
如上图1对应的邻接矩阵为:
v0 v1 v2 v3 v4
V0 0 20 ∞ ∞ 10
V1 20 0 6 ∞ 9
V2 ∞ 6 0 3 8
V3 ∞ ∞ 3 0 5
V4 10 9 8 5 0
算法的基本思想是按照路径长度的增长来通过迭代,依次求得v0节点到其他节点的路径长度,当经过n次迭代后,即可求出v0到其他n-1个节点之间的最短路径长度。首先将节点分为两个集合S1和S2,其中S1初始只包含v0节点,S2初始为其他节点,然后算法按照以下规则来迭代:
(1)从集合S2中选择一个节点vi使其到v0节点之间的距离最短,并把vi加入到S1集合中;
(2)用vi作为中间节点来过渡,判断是否能通过vi节点作为中间节点,使得从v0到S2集合中其他的节点路径更短,如果通过vi作为中间节点的过渡得到的距离更短,即更新v0到S2中节点之间的距离权值;
<