【算法模板】堆优化版Dijkstra最短路算法(超短)

简述

Dijkstra算法:由Dijkstra提出的,基于贪心
应用:单源最短路径问题并且权值不为负, 适用于稀疏图
优化前:时间复杂度O(N2) , 空间复杂度O(N)
优化后:时间复杂度O(MlogN) , 空间复杂度O(N) 空间是来存储1点到各个点的距离

算法策略

基于朴素版Dijkstra最短路算法.,将第一步在所有不确定的点中找到离1最短的点进行了优化,利用数据结构堆来优化

堆优化版Dikstra算法模板

其中,下面的图是用邻接矩阵g来存储,dis[i]表示1点到i点的距离,st[i]表示i点是否已经确定,小顶堆heap存储的pair含义分别是距离和点编号。

int dijkstra(){
	//初始化
    memset(dis, 0x3f , sizeof dis);
    dis[1] = 0;
    priority_queue<PAIR,vector<PAIR>,greater<PAIR>> heap;
    heap.push({0, 1});
    
    while (heap.size()){
        auto t = heap.top();
        heap.pop();
        int ver = t.second , distance = t.first;
        
        if (st[ver] == true) continue;
        st[ver] = true;
        //用该点去确定其他点
        for (int p = h[ver] ; p != -1 ; p = ne[p]){
            int j = e[p];
            if (dis[j] > dis[ver] + w[p]){
                dis[j] = dis[ver] + w[p];
                heap.push({dis[j],j});
            }
        }
        
    }
    //1和n不连通
    if (dis[n] == 0x3f3f3f3f) return -1;
    return dis[n];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值