编程验证带权图的最短路径路由算法

本文介绍了如何利用C语言实现带权图的最短路径路由算法,包括迪杰斯特拉算法和Floyd算法。文章详细讲解了两种算法的原理,并提供了C语言程序验证这两种算法。通过读取文件数据构建无向带权图,程序分别输出了单源节点到其它节点的最短路径和所有节点对间的最短路径。
摘要由CSDN通过智能技术生成

       在在一个带权图中,从某一个单源节点,走到其他节点,如何求得所有路径中的最短路径,是单元节点最短路径问题。而在路由算法中,与此类似,可以抽象出该模型来。迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于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个节点之间的最短路径长度。首先将节点分为两个集合S1S2,其中S1初始只包含v0节点,S2初始为其他节点,然后算法按照以下规则来迭代:

(1)从集合S2中选择一个节点vi使其到v0节点之间的距离最短,并把vi加入到S1集合中;

(2)用vi作为中间节点来过渡,判断是否能通过vi节点作为中间节点,使得从v0S2集合中其他的节点路径更短,如果通过vi作为中间节点的过渡得到的距离更短,即更新v0S2中节点之间的距离权值;

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值