最短路径算法之Djikstra算法 优先队列 邻接表优化 C++

本文介绍了Dijkstra最短路径算法的基础版和优化版,通过C++实现并利用优先队列和邻接表进行优化,降低了时间复杂度。在基础版中,通过广度优先搜索遍历图,并使用vis和dis集合记录访问状态和最短距离。优化版则用vector创建邻接表,结合priority_queue自动排序,提升了效率。

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

原理及思路

基础版

  • 利用广度优先搜索BFS, 遍历整个图
  • 使用两个集合, vis 负责顶点访问标志, dis 负责实时更新顶点
  • 开始时 dis 只有源顶点, 且源顶点到每个顶点的距离为无穷大(infinity), 接着把所有与目前顶点连通的顶点, 纳入到dis中, 更新到新顶点的最短距离, 更新 vis 访问标志
  • 重复第二个动作, 直到所有顶点纳入到 dis 中

优化版

  1. 背景: 基础版由于双层循环, 时间复杂度达到O(n^2), 当 n 过大时, 时间会爆掉
  2. 原理和思路:
    • 利用vector创建邻接表, 替换二维数组, 节省空间
    • 把最短路径排序更新, 使用C++自带STL——priority_queue 优先队列, 来保存新加入顶点的权值, 完成自动排序, 减少运行时间

实现

测试数据

4 5
1 2 3
1 3 5
1 4 7
2 4 2
3 4 1

基础无优化版

#include<iostream>
#include<cstring>
using namespace std;

const int INF = 10000;
int edge[50][50];
int dis[50];//d表示源节点到该节点的最小距离
bool vis[50];//v标记访问过的节点
int n, m;//n代表点数 m代表边数
int main()
{
   
   
	freopen("in.txt", "r", stdin);
    scanf("%d%d", &n, &m);
    int min;
    int x, y, d;
    memset(edge, INF, sizeof(edge)); //使用一个值初始化无限大 
    memset(dis, INF, sizeof(dis));
    memset(vis, false, sizeof(vis));
    for(int i = 0; i < m;i++) {
   
   
        scanf("%d%d%d", &x, &y, &d);
        edge
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值