首页 > 其他分享 >[模板] 单源最短路 Dijksra

[模板] 单源最短路 Dijksra

时间:2024-12-10 16:53:30浏览次数:9  
标签:pq vis int Dijksra 单源 start 模板 dis

单源最短路:Dijksra

单源最短路,时间复杂度\(O(nlog(n+m))\)

不适用于有负权边的图

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct edge
{
    int to, w;
};
vector<vector<edge>> adj;
vector<int> dis;
vector<bool> vis;
int n, m, start;

bool operator<(const edge a, const edge b) // 大根堆:重载小于号
{
    return a.w > b.w;
}

bool cmp(const edge a, const edge b)
{
    return a.w > b.w;
}

void dijkstra(int start)
{
    dis[start] = 0;

    priority_queue<edge> pq;
    pq.push({start, 0});

    while (!pq.empty())
    {
        auto [u, now] = pq.top();
        pq.pop();

        if (vis[u])
            continue;

        vis[u] = 1;
        for (auto [to, w] : adj[u])
        {

            if (!vis[to] and dis[u] + w < dis[to])
            {
                dis[to] = dis[u] + w;
                pq.push({to, dis[to]});
            }
        }
    }
}

void add(int a, int b, int w)
{
    adj[a].push_back({b, w});
}

int main()
{

    cin >> n >> m >> start;

    dis.resize(n + 1, INT_MAX);
    vis.resize(n + 1, 0);
    adj.resize(n + 1);
    for (int i = 0; i < m; ++i)
    {
        int a, b, w;
        cin >> a >> b >> w;
        add(a, b, w);
    }

    dijkstra(start);
    for (int i = 1; i <= n; ++i)
        cout << dis[i] << ' ';

    cout << '\n';

    return 0;
}


标签:pq,vis,int,Dijksra,单源,start,模板,dis
From: https://www.cnblogs.com/2hard4me/p/18597658

相关文章

  • web大学生个人网站作业模板——上海旅游景点介绍网页代码 家乡旅游网页制作模板 大学
    家乡旅游景点网页作业制作网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有运用,CSS的代码量也很足、很细致,使用hover来完成过渡效果、鼠......
  • 给你一个参考网站,你能快速下载它的模板吗?用哪些方法?
    我不能直接下载网站模板。我是一个大型语言模型,我没有访问互联网或下载文件的功能。我只能处理和生成文本。要下载网站模板,你需要使用浏览器或其他工具。以下是一些常用的方法:检查网站源码:很多简单的网站可以直接通过查看页面源代码(通常通过右键点击页面,选择“查看页面源代......
  • c++ 模板编程
    c++模板编程C++中模板分为函数模板和类模板函数模板:是一种抽象函数定义,它代表一类同构函数。类模板:是一种更高层次的抽象的类定义。优缺点优点代码复用  模板允许编写与具体数据类型无关的代码,从而实现代码复用。你可以针对不同的数据类型使用相同的模板函数或模板类,而......
  • Java模板引擎 Velocity
    目录前言1.Velocity模板引擎概述1.1什么是Velocity1.2Velocity的特点1.3Velocity的主要应用场景2.Velocity的核心原理2.1模板准备2.2数据填充2.3渲染输出3.Velocity的基本使用方法3.1环境配置3.2编写模板3.3数据填充与渲染3.4常见功能示例4.Velocity在......
  • 题解:P11266 【模板】完全体·堆
    题目链接洛谷P11266【模板】完全体·堆解题思路看了题解区,竟然没有人写可爱的左偏树。我们需要支持四种操作:删除集合中的元素。取集合中的最小值。合并两个集合。修改集合中的元素。那么我们可以用常数极小的左偏树(可并堆)来解决这道模板题。对于左偏树的基础操作......
  • 5.1.1 C++函数模板和类模板注意事项
    一)函数注意事项·1.自动类型推导,必须推导出一致的数据类型T,才可以用。·2.模板必须要确定出T的数据类型,才可以使用。(必须给出类型表达式)二)普通函数与函数模板的区别·1.普通函数调用时可以发生自动类型转换(隐式类型转换)。·2.1函数模板调用时,如果利用“自动类型推导......
  • 你有用过哪些模板引擎?你觉得哪个好用?为什么?
    我作为一个大型语言模型,并没有真正“使用”模板引擎的方式如同前端开发者那样。我没有运行JavaScript代码或构建网页的能力。我的工作方式是基于文本的处理和生成。我更像是理解并能生成使用模板引擎的代码,而不是一个实际操作的用户。但是,我可以根据大量的代码示例和开发者讨论......
  • 模板函数使用is_same的注意事项
    在模板函数中使用is_same判断类型的话,编译器会实例化所有路径,即使某些路径在运行时不会被执行。这意味着编译器会检查所有的分支,确保它们都是有效的。例如如果存在从string转为int的路径,即便T为string时不会进入该路径,依旧会编译失败。template<classT>voidf(){ if(is_sa......
  • 【java】利用aspose.words的ReportingEngine填充word模板
    详情见:https://gitee.com/javadog-net/boot-apose前言⏲️本文阅读时长:约10分钟......
  • 【题解】P5787 二分图 /【模板】线段树分治
    二分图最简单的方法是染色法实现,但是扩展域并查集也可以实现,有两个集合\(S,T\),具体的是相连边的两个点\(x,y\)总是在不同的两个集合中,若出现在同一集合中即不是一个二分图。对于时间段建边考虑用线段树储存,线段树按照时间轴划分,将将对应时间区间的节点储存上当前连边操作,小时......