【图论】Dijkstra

Dijkstra


前置知识


思路

Dijkstra 算法是一种求正权图单源最短路的算法。

注意到BF最大的缺陷在于其对于一个点的松弛方式太暴力了。

注意到有正权这个条件。

那么我们发现,只要选取当前距离最小的点,该点不可能被松弛。

于是使用一个小根堆维护距离即可。


算法参数

  • 时间复杂度: O ( m log ⁡ n ) O(m\log n) O(mlogn)
  • 空间复杂度: O ( n + m ) O(n+m) O(n+m)

实现代码

cpp 复制代码
struct node{int u,d;};
bool operator<(node a,node b){return a.d>b.d;}
void Dijkstra(int s){
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    priority_queue<node> q;
    q.push({s,0});
    while (!Q.empty()){
        node cur=q.top();
        q.pop();
        int u=fr.u,k=fr.d;
        if (k!=d[u]) continue;
        for (node e:G[u]){
            int v=e.v,w=e.w;
            if (d[u]+w<d[v]){
                d[v]=d[u]+w;
                q.push({v,d[v]});
            }
        }
    }
}

练习

相关推荐
2301_822366351 分钟前
C++中的协程编程
开发语言·c++·算法
m0_736919101 分钟前
C++中的事件驱动编程
开发语言·c++·算法
嵌入小生0072 分钟前
数据结构基础内容 + 顺序表 + 单链表的学习---嵌入式入门---Linux
linux·数据结构·学习·算法·小白·嵌入式软件
xhbaitxl5 分钟前
算法学习day30-贪心算法
学习·算法·贪心算法
热爱编程的小刘7 分钟前
Lesson03---类与对象(中篇)
c++
小程同学>o<7 分钟前
嵌入式之C/C++(三)指针
c语言·c++·算法·嵌入式软件·嵌入式面试题库
lxl13079 分钟前
学习C++(4)构造函数+析构函数+拷贝构造函数
开发语言·c++·学习
季明洵9 分钟前
两数之和、四数相加II、三数之和、四数之和
java·数据结构·算法·leetcode·蓝桥杯·哈希算法
机器学习之心10 分钟前
基于AHP(层次分析法)-模糊综合评价法的工程实践能力评价系统MATLAB代码
算法·matlab·层次分析法·模糊综合评价法
阿kun要赚马内11 分钟前
Qt写群聊项目(二):客户端
开发语言·c++·qt