数据结构学习笔记-Dijkstra算法(C语言邻接表实现)

本文介绍了Dijkstra算法在计算有权值图的单源最短路径问题中的应用,详细讲解了算法的核心思想和实现步骤。通过C语言实现邻接表,讨论了处理负权边的问题,并探讨了算法的时间复杂度,包括直接扫描和使用最小堆两种情况。

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

Dijkstra算法是计算有权值图的单源最短路径问题的经典算法

算法核心思想:定义一个顶点集合S{V0,V1,……Vn},初始条件下集合S中只包含起始源点。

对于所有顶点V,定义dist[V]来表示V到源点的最短距离。

每次循环在所有未被收录进集合S的顶点中,挑选出dist值最小的顶点Vmin,将其收录进集合S。

当一个顶点V被收录进集合S中时,检测V的所有邻接点的dist值是否产生变化。

注意:Dijkstra算法不能处理负权边。

变量定义和初始化:

double dist[Graph->nV];
int path[Graph->nV];
int dijkstra[Graph->nV];

dist数组用于记录任一顶点到源点的最短距离,path数组用来记录通过最短距离找到该顶点的路径(path[V]即V的前一个必经顶点),dijkstra数组用来标记顶点是否被收录进集合S;

for(int i=0;i<Graph->nV;i++){
    dist[i]=__DBL_MAX__,path[i]=-1,dijkstra[i]=0;
}
dijkstra[start]=1;
dist[start]=0;

将所有顶点的dist值初始为正无穷,所有顶点的路径(指示前一顶点)初始为-1,集合S初始为空。

对于源点V,首先将其收录到集合S中,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值