当前位置: 首页 > news >正文

洛谷 单源最短路径 Dijkstra算法+优先队列

题目描述

给定一个 n 个点,m 条有向边的带非负权图,请你计算从 s 出发,到每个点的距离。

数据保证你能从 s 出发到任意点。

输入格式

第一行为三个正整数 n,m,s。 第二行起 m 行,每行三个非负整数 ui​,vi​,wi​,表示从 ui​ 到 vi​ 有一条权值为 wi​ 的有向边。

输出格式

输出一行 n 个空格分隔的非负整数,表示 s 到每个点的距离。

代码:

#include <bits/stdc++.h>
#define MX 200005
using namespace std;
//Dijkstra算法和优先队列 
int n,m,s;
long long dis[MX] = {0};
bool visited[MX] = {0};
struct edge {
    int next,to,weight;
};
edge edge[MX];
int head[MX] = {0};
int cnt;//指针
void addedge(int u,int v,int w) {
    edge[++cnt].to = v;
    edge[cnt].next = head[u];
    edge[cnt].weight = w;
    head[u] = cnt;
}
struct priority {
    long long int dis;
    int id;
    //重载运算符维护最小值 
    bool operator <(const priority &x)const{
        return x.dis < dis;
    }
};
priority_queue<priority> q;
int main() {
    cin>>n>>m>>s;
    for(int i = 1; i <= n; i++) {
        dis[i] = 2e9;
    }
    while(m--) {
        int u,v,w;
        cin>>u>>v>>w;
        addedge(u,v,w);
    }
    dis[s] = 0;
    q.push((priority) {0,s});
    int u;
    while(!q.empty()) {
        priority tmp = q.top();
        q.pop();
        u = tmp.id;
        //cout<<u<<endl;
        if(!visited[u]) {
            visited[u] = 1;
            for(int i = head[u]; i != 0; i = edge[i].next) {
                if( dis[edge[i].to] > dis[u] + edge[i].weight) {
                    dis[edge[i].to] = dis[u] + edge[i].weight;
                    int v = edge[i].to;
                    if(!visited[v])
                    {
                        q.push((priority){dis[v],v});
                    }
                }
            }
        }
    }
    for(int i = 1; i <= n; i++) {
        cout<<dis[i]<<" ";
    }
    return 0;
}

相关文章:

  • 华为云Flexus+DeepSeek征文|Flexus云服务器单机部署+CCE容器高可用部署快速搭建生产级的生成式AI应用
  • 如何通过RL真正提升大模型的推理能力?NVIDIA提出长期强化学习训练框架ProRL
  • 通过模型文件估算模型参数量大小
  • 数据湖是什么?数据湖和数据仓库的区别是什么?
  • vscode中无法使用npm node
  • STM32的ADC简介
  • 51单片机基础部分——数码管显示
  • 解决idea编译运行项目时间长的问题
  • 【学习笔记】TCP 与 UDP
  • 【映射】2024-睿抗-AcWing 5834. 谁进线下了?
  • go语言的锁
  • echarts使用graph、lines实现拓扑,可以拖动增加effect效果
  • Kafka入门- 基础命令操作指南
  • P1064 [NOIP 2006 提高组] 金明的预算方案——依赖背包
  • k8s热更新-subPath 不支持热更新
  • 界面组件DevExpress WPF中文教程:Grid - 如何识别行和卡片?
  • 数据结构(7)—— 二叉树(1)
  • 微信小程序动态组件加载的应用场景与实现方式
  • 字节开源FlowGram:AI时代可视化工作流新利器
  • 【Axure视频教程】下载和安装Axure汉化包
  • wordpress 图片 旋转/aso优化师主要是干嘛的
  • 洛阳网站建设找洛阳铭信网络/晚上国网app
  • 广州专业网站建设有哪些/现在如何进行网上推广
  • 深圳服务好的网站建设/lpl赛区战绩
  • 上海网站建设公司/百度top风云榜
  • 案例较少如何做设计公司网站/适合企业员工培训的课程