【图论】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]});
            }
        }
    }
}

练习

相关推荐
郝学胜-神的一滴9 小时前
Qt的QSlider控件详解:从API到样式美化
开发语言·c++·qt·程序人生
橘颂TA9 小时前
【剑斩OFFER】算法的暴力美学——连续数组
c++·算法·leetcode·结构与算法
学困昇9 小时前
C++11中的{}与std::initializer_list
开发语言·c++·c++11
郝学胜-神的一滴9 小时前
Qt的QComboBox控件详解:从API到样式定制
开发语言·c++·qt·程序人生·个人开发
星释10 小时前
Rust 练习册 72:多米诺骨牌与回溯算法
开发语言·算法·rust
程序喵大人12 小时前
推荐个C++高性能内存分配器
开发语言·c++·内存分配
zephyr0512 小时前
深入浅出C++多态:从虚函数到动态绑定的完全指南
开发语言·c++
算法与编程之美12 小时前
提升minist的准确率并探索分类指标Precision,Recall,F1-Score和Accuracy
人工智能·算法·机器学习·分类·数据挖掘
MicroTech202513 小时前
微算法科技(NASDAQ :MLGO)混合共识算法与机器学习技术:重塑区块链安全新范式
科技·算法·区块链
码力码力我爱你13 小时前
C++静态变量依赖关系
java·jvm·c++