堆优化 dijkstra 简介

dijkstra

前言

原本我真的不会什么 dijkstra 只用那已死的 spfa ,还有各种玄学优化,可是,我不能相信一个已死的算法,就像我不能相信自己。

ps : 虽然他已经活了

我站在镜子前,嘲弄这原本的愚蠢

正文

dijkstra 是一种用于解决单源最短路的算法,虽然我也用它来跑全源最短路(不会 floydJohnson,以后会补充)

他的应用范围不广不窄,能解决在非负权图上的问题。

朴素 dijkstra

主要分为几步

  1. 初始化源节点的路径,给源节点打上能到的标记
  2. 再所有能到达的点里找出 dis 最短的没被 vis 过的节点 u,并给 u 点打上 vis 标志 (vis 在这里其实没什么用)
  3. 用 u 点对其他点做松弛,后返回第二步
  4. 直到所有节点都 vis 过

弊端明显 \(O(n^2)\) 的复杂度崩了

于是我们用堆优化

堆优化 dijkstra

我们有一个优先队列来做第二步这样每次就是\(\log_2 n\)的取出

void dijkstra(){
    priority_queue<Point> q;
    dis[1]=0;q.push((Point){1,0});
    while(!q.empty()){
        Point fr=q.top();
        q.pop();
        if(vis[fr.id]) continue;
        vis[fr.id]=1;
        for(int i=h[fr.id];i!=-1;i=edge[i].lac){
            int to=edge[i].to;
            if(dis[to]>dis[fr.id]+edge[i].wg){
                dis[to]=edge[i].wg+dis[fr.id];
                q.push((Point){to,dis[to]});
            }
        }
    }
}

核心代码如上。

好像确实没什么技术含量。。。不过我弱呀

就这样吧,我自顾自地走开。连痕迹也没留下

猜你喜欢

转载自www.cnblogs.com/zhltao/p/12311357.html