单源最短路径问题Dijkstra算法的c语言实现

本文介绍了单源最短路径问题的Dijkstra算法,通过层序遍历节点的方法来实现。从源节点开始,逐层推进,计算节点的最短路径。算法中,节点按与源节点的距离分层,同一层的节点进行处理,更新其相邻节点的距离值,确保路径最优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值是依照图赋的,邻接节点赋对应边的权值,其他节点赋无穷大)。在Dijkstra算法的每一个阶段,将未处理的节点放入一个集合S,扫描S中距离最小的一个节点v,将v置为处理状态。然后在剩下的所有未处理节点中,对于每个节点w,如果w对应的距离小于v对应的距离加上v到w的距离,则将w对应的距离更新为v对应的距离加上v到w的距离。直到S为空,算法结束。

       本文换了一种思路,考虑按照层序来遍历节点。我们先来看一下什么是层序。如下图所示(《数据结构与算法分析——c语言描述》fig9.20),令源节点为v1(第一层),因为v2和v4与v1邻接,则可以称v2和v4层序相同,即位于第二层,考虑v2,v4与v5与之邻接,位于第三层序。值的注意的是,v4的层序发生了变化,但这并不影响结果。因为按层序遍历节点只是一种搜索的方式v4在第一层序中已经计算过,但路径不同(第一次是v1->v4,第二次是v1->v2->v4)。显然,v4处的距离值取小的那一个。计算完相同层序的节点后,程序继续计算下一层序的节点,从源节点出发,逐层往外推进。


#include <stdio.h>
#include <stdlib.h>

typedef int Vertex;//图节点编号
#define x 10000 //表示无穷大
#define size 7//节点数目

int Graph[size][size] = 
//  1  2  3  4  5  6  7

{
	x, 2, x, 1, x, x, x,//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值