单源最短路径(堆优化的Dijkstra算法)

本文介绍了Dijkstra算法的基本原理,它从初始节点开始,逐步找到到其他节点的最短路径。当没有直接线路时,距离设为无穷大。通过将节点加入集合S并不断更新相邻节点的最短距离,直到覆盖所有节点。原始算法时间复杂度为O(n^2),而堆优化后的Dijkstra算法采用堆排序,时间复杂度降低至O(n*logn)。

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

Dijkstra算法:设初始节点为v,起始节点到其他节点u的距离为图中v到u的直接线路的距离,如果v和u之间没有直接线路,则d[u]=INF(无穷大)。初始化S={v},寻找最短路径(即在d[]中寻找使d[u]最小的u),将u加入到S中,然后更改到u节点可到达节点的最小距离。再寻找次短路径,并将次短路径的目标节点(设为u)加入到S中,更改到u节点可到达节点的最小距离.如此下去,知道S=V.

一般的Dijkstra算法每次寻找最短路径的时间复杂度O(n),整个算法的时间复杂度为O(n^2).带堆优化的Dijkstra算法每次寻找最短路径时采用堆排序,时间复杂度O(logn)。整个算法的时间复杂度为O(n*logn).

#include<stdio.h>
#include<malloc.h>
#define INF 65535

typedef struct ArcNode{
    int dst;
    int value;
    struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode{
    int data;
    ArcNode * firstedge;
}VNode;

void createAdjList(VNode *&L,int n,int m);
void Dijkstra(int *&d,VNode *&L,int n);
void HeapSort(int *&d,int *&dsti,
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值