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

练习

相关推荐
东莞呵呵5 分钟前
吴恩达机器学习(1)——机器学习算法分类
算法·机器学习·分类
虾球xz9 分钟前
游戏引擎学习第293天:移动Familiars
c++·学习·游戏引擎
孙同学_24 分钟前
【C++】map和set的使用
开发语言·c++
wjm04100639 分钟前
C++中的容器
开发语言·c++
脚大江山稳2 小时前
二进制与十进制互转的方法
c++
远瞻。4 小时前
【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2
论文阅读·算法
先做个垃圾出来………7 小时前
哈夫曼树(Huffman Tree)
数据结构·算法
醍醐三叶8 小时前
C++类与对象--2 对象的初始化和清理
开发语言·c++
phoenix@Capricornus9 小时前
反向传播算法——矩阵形式递推公式——ReLU传递函数
算法·机器学习·矩阵
Inverse1629 小时前
C语言_动态内存管理
c语言·数据结构·算法