首页 > 其他分享 >基于链式前向星的堆优化dijsktra | 模板

基于链式前向星的堆优化dijsktra | 模板

时间:2022-10-21 21:12:55浏览次数:45  
标签:std int d% dijsktra 链式 include 前向星 dis

关于SPFA,ta死了

基于链式前向星的堆优化\(dijsktra\):

复杂度\(O(mlogn)\),要求非负权。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>

#define ll long long

const int maxn = 5e5 + 10;
const int inf = 2147483647;
int head[maxn << 1], to[maxn << 1], nxt[maxn << 1], val[maxn << 1], cnt;
ll dis[maxn];
bool vis[maxn];
int n, m, s;

inline void add(int a, int b, int c) {
    to[++cnt] = b;
    val[cnt] = c;
    nxt[cnt] = head[a];
    head[a] = cnt;
}

inline void init() {
    for (int i = 1; i <= n; i++) dis[i] = inf;
    dis[s] = 0;
}

inline void dijsktra() {
    init();
    std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int> >, std::greater<std::pair<int, int> > > q;
    q.push(std::make_pair(0, s));
    while (!q.empty()) {
        int u = q.top().second;
        q.pop();
        for (int i = head[u]; i; i = nxt[i]) {
            int v = to[i];
            if (vis[v]) continue;
            if (dis[v] > dis[u] + val[i]) {
                dis[v] = dis[u] + val[i];
                q.push(std::make_pair(dis[v], v));
            }
        }

    }
    return;
}

int main() {
    scanf("%d%d%d", &n, &m, &s);
    while (m--) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w);
    }
    dijsktra();
    for (int i = 1; i <= n; i++)
        printf("%lld ", dis[i]);
    return 0;
}

标签:std,int,d%,dijsktra,链式,include,前向星,dis
From: https://www.cnblogs.com/MrWangnacl/p/16814769.html

相关文章

  • 数据结构—线性表的链式表示和实现
    一、链表概念链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。线性表的链式表示又称为非顺序映像或链式映像。用一组物理位置任意的......
  • 数据结构作业的代码——————栈的链式实现
    作业code2:仿照作业​​code1​​的功能,将课本上链表的实现栈的功能完整实现需要通过main函数调用并能进行友好的人机交互输入#include<bits/stdc++.h>#define#define#defin......
  • QFramework v1.0 使用指南 架构篇:08. FluentAPI 链式 API
    FluentAPI简介FluentAPI是笔者积累的UnityAPI的一些链式封装。基本使用非常简单,如下://traditionalstylevarplayerPrefab=Resources.Load<GameObject>("nop......
  • 栈的链式储存结构及应用:四则运算表达式求值(中缀表达式转化为后缀表达式并求值)
    遇到的问题一:SegmentationFault(存储器区块错误)遇到的问题二:函数内变量一经声明其地址已固定,导致同一结点反复入栈遇到的问题三:对字符串如何标记和提取单个数值/*//////......
  • Rust 链式调用引发的问题 consider using a `let` binding to create a longer lived
        temporaryvaluedroppedwhileborrowedconsiderusinga`let`bindingtocreatealongerlivedvalue为什么会报这个错?因为maps.lock.unwrap.values.........
  • dijsktra求最短路径
    讲算法原理的有很多,直接贴代码dijkstra算法是直接对邻接矩阵进行操作求出最短路径的,我项目中的图结构需要转化成邻接矩阵,所以会有下面代码图结构是一个map,first表示节点的in......
  • 链式存储结构
    链表的插入,删除比较方便,在给定前驱节点的时候,时间复杂度为O(1)查找比较麻烦,要根据头指针一个一个往下找,时间复杂度为O(n)单链表头插法#include"iostream"typedef......
  • node37-promise链式编程
    constfs=require('fs');/*fs.readFile('./1.txt','utf8',(err,result1)=>{console.log(result1);fs.readFile('./2.txt','utf8',(err,result2)=......
  • 链式编程学习
    链式编程学习什么是链式编程在我们编写代码过程中听到过很多说法;像面向切面编程、函数式编程、面向对象编程、泛式编程、面向接口等。所谓的链式编程,则是类似与StringBu......
  • 链式编程的总结以及在生产环境的应用
    链式编程是将多个操作通过点号"."链接在一起成为一个整体,从而更加的简洁方便。链式编程的原理就是每个操作完成后都会返回一个this对象,也就是返回对象本身!在生产实际环境的......