当前位置: 首页 > 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;
}

http://www.lqws.cn/news/117271.html

相关文章:

  • Flask框架详解:轻量高效的Python Web开发利器
  • 固定ip和非固定ip的区别是什么?如何固定ip地址
  • 搭建强化推荐的决策服务架构
  • OSPF域间路由
  • 企业的业务活动和管理活动是什么?-中小企实战运营和营销工作室博客
  • react+taro 开发第五个小程序,解决拼音的学习
  • 链路状态路由协议-OSPF
  • SpringAI集成DeepSeek实战
  • 近几年字节飞书测开部分面试题整理
  • 二极管MOS管选型
  • 【AI学习笔记】Coze工作流写入飞书多维表格(即:多维表格飞书官方插件使用教程)
  • Spring AI Tool Calling
  • Spring 中注入 Bean 有几种方式?
  • 通用寄存器的 “不通用“ 陷阱:AX/CX/DX 的寻址禁区与突围之道
  • 质检 LIMS 系统数据防护指南 三级等保认证与金融级加密方案设计
  • 设计模式-迪米特法则
  • 【Linux】自动化构建-Make/Makefile
  • DeepSeek 赋能金融衍生品:定价与风险管理的智能革命
  • 知识拓展卡————————关于Access、Trunk、Hybrid端口
  • 【C++】string类的模拟实现(详解)
  • Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
  • Vim查看文件十六进制方法
  • 玄机-第六章 流量特征分析-蚂蚁爱上树
  • 在WPS中如何启用宏VBA wps.vba.exe下载和安装
  • MySQL 索引底层原理剖析:B+ 树结构、索引创建维护与性能优化策略全解读
  • 【OSG学习笔记】Day 15: 路径动画与相机漫游
  • 东西方艺术的对话:彰显中国传统艺术之美与价值
  • Java对象创建过程
  • 电脑频繁黑屏怎么办
  • Linux 进程调度与管理:从内核管理到调度机制的深度解析