Dijkstra算法-lanqiao1122

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
const int N = 3e5 + 5;
struct edge{
    int from, to;//边:起点,终点,权值;起点from没有用到,e[i]的i就是from
    long long w;
    edge(int a,int b,long long c){
        from = a;
        to = b;
        w = c;
    }
};
vector<edge> e[N];//存储图 e数组中存储了N个 vector<edge> 类型的元素
struct node{//点
    int id;
    long long n_dis;//id: 节点,n_dis: 这个点到起点的距离
    node(int b,long long c){
        id = b;
        n_dis = c;
    }
    bool operator < (const node & a)const{//优先级最高的放在priority_queue的顶部,所有重载使得n_dis越小,优先级越高
        return n_dis > a.n_dis;
    }
};
int n, m;
int pre[N];//记录前驱节点
void print_path(int s,int t){//打印起点到t点的最短路径
    if(s == t){
        printf("%d ", s);
        return;
    }
    print_path(s, pre[t]);//先打印到前一个点的路径
    printf("%d ", t);
}
long long dis[N];//记录所有节点到起点的距离
bool done[N];   //done[i] = true 表示节点i的最短路径已经找到
void dijkstra(){
    int s = 1;
    for (int i = 1; i <= n; i++){//初始化
        dis[i] = INF;
        done[i] = false;
    }
    dis[s] = 0;//起点到自己的距离显然是0
    priority_queue<node> Q;//优先队列,存储节点信息
    Q.push(node(s, dis[s]));
    while(!Q.empty()){
        node u = Q.top();   //这里弹出的是距离起点s距离最小的节点
        Q.pop();
        if(done[u.id])
            continue;//如果已经找到了这个节点的最短路径,则跳过该节点
        done[u.id] = true;
        for (int i = 0; i < e[u.id].size(); i++){//检查节点u的所有邻居
            edge y = e[u.id][i];//u.id的第i个邻居是y.to
            if(done[y.to]){
                continue;
            }//丢弃已经找到最短路径的邻居节点
            if(dis[y.to] > y.w + u.n_dis){
                dis[y.to] = y.w + u.n_dis;
                Q.push(node(y.to, dis[y.to]));//拓展新邻居,放入优先队列
                pre[y.to] = u.id;//记录前驱节点
            }
    }
}
}

int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++){
        e[i].clear();
    }
    while(m--){
        int u, v, w;
        cin >> u >> v >> w;
        e[u].push_back(edge(u, v, w));
    }
    dijkstra();
    for (int i = 1; i <= n; i++){
        if(dis[i] >= INF)
            cout << "-1 ";
        else{
            cout << dis[i] << " ";
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JUC-synchronized无锁、偏向锁、轻量级锁、重量级锁

1 synchronized实操 关键字synchronized可以用来保证多线程并发安全的**原子性、可见、有序性。**关键字synchronized不仅可以作用于方法还可以作用于同步代码块&#xff0c;能够保证作用范围中线程访问安全。 注意&#xff1a;局部变量是线程安全的。线程不安全问题只存在于实…

excel中多行合并后调整行高并打印

首先参考该文&#xff0c;调整全文的行高。 几个小技巧&#xff1a; 1.转换成pdf查看文件格式 2.通过视图--》分页预览&#xff0c;来确定每页的内容&#xff08;此时页码会以水印的形式显示&#xff09; 3. 页面布局中的&#xff0c;宽度可以选为自动&#xff0c;因为已经是…

ASP.NET 7 Core Web 读取appsetting.json

把一些配置信息保存在json文件可以避免更改时要重新发布程序的烦恼。 我这里使用的是写一个类文件&#xff0c;然后通过program.cs启动的方式&#xff08;.net 6 开始没有startup了&#xff09;。 项目类型&#xff1a;ASP.NET Core Web MVC / .NET 7.0 / VS2022 第一步…

苹果提审被拒反馈崩溃日志.text | iOS 审核被拒crashLog

iOS审核人员拒绝后每个截图&#xff0c;只给了几个text文件&#xff0c;这种情况就是审核的时候运行你的代码&#xff0c;崩溃了。 仅仅看text文件&#xff0c;是看不出所以然来的&#xff0c;所以我们要将日志转换成.crash格式 1.将.text文件下载下来&#xff0c;将 .text手动…

OpenHarmony关系型数据库

1 概述 关系型数据库(Relational Database, 以下简称RDB)是一种基于关系模型来管理数据的数据库&#xff0c;是在SQLite基础上提供一套完整的对本地数据库进行管理的机制&#xff0c;为开发者提供无需编写原生SQL语句即可实现数据增、删、改、查等接口&#xff0c;同时开发者也…

算法笔记:地理探测器

1 空间分层异质性&#xff08;spatial stratified heterogeneity&#xff09; 空间分层异质性&#xff08;空间分异性/区异性&#xff09;&#xff1a;层内方差小于层间方差的地理现象例如气 候带、土地利用图、地貌图、生物区系、区际经济差异、城乡差异以及主体功能区等 等[…

张维迎《博弈与社会》笔记(3)导论:一些经济学的基础知识

这篇的主要内容介绍了经济学的基础知识吧。 经济学、社会学、心理学的区别 经济学与社会学的区别与共同点 经济学一般是从个人的行为出发解释社会现象&#xff08;from micro to macro&#xff09;。社会学的传统方法则是从社会的角度来解释个人的行为&#xff08;from macro…

Oracle分栏(非分页)查询

不知道Oracle怎么进行数据分栏(分栏: 因数据列过长, 部分数据作为新列显示). 在这里先记录一下粗浅的查询方法. 数据源例子: select 日用百货 as cat, 手电筒 as name, 20 as amount, 2024-01-27 as dt from dualunion allselect 餐饮美食 as cat, 鸡公煲 as name, 15.9 as amo…

外卖跑腿系统开发:构建高效、安全的服务平台

在当今快节奏的生活中&#xff0c;外卖跑腿系统的开发已成为技术领域的一个重要课题。本文将介绍如何使用一些常见的编程语言和技术框架&#xff0c;构建一个高效、安全的外卖跑腿系统。 1. 技术选择 在开始开发之前&#xff0c;我们需要选择适合的技术栈。常用的技术包括&a…

Java 字符串 10 字符串相关类的底层原理

底层原理1&#xff0c;底层原理2 底层原理3&#xff1a; 分两种情况&#xff1a; 1、等号右边没有变量&#xff1a; 2、等号右边有变量&#xff1a; 两个对象&#xff0c;一个是StringBuilder&#xff0c;一个是String&#xff0c;浪费空间&#xff0c;性能不高 在jdk8之前&am…

设计模式⑩ :用类来实现

文章目录 一、前言二、Command 模式1. 介绍2.应用3. 总结 三、Interpreter 模式1. 介绍2. 应用3. 总结 参考文章 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书"系列。本系…

go语言(十九)---- channel

channel的使用 //1. 发送value到channelchannel <- value //2. 接收并将其丢弃<- channel //3. 从channel中接收数据&#xff0c;并将其赋值给x x : <- channel 例子 package mainimport "fmt"func main() {//定义一个channelc : make(chan int)go func…

Qlik Sense : ErrorCode(错误变量)

错误变量 所有错误变量的值在脚本执行之后依然保留。第一个变量 ErrorMode 由用户输入&#xff0c;最后三个变量是 Qlik Sense 的输出&#xff08;包括脚本中错误的信息&#xff09;。 使用每个变量的下拉列表可查看每个变量的简短描述和语法。单击语法描述中的变量名称可了解…

Java强训day6(选择题编程题)

选择题 class HelloA{public HelloA(){System.out.println("I’m A class ");}static{System.out.println("static A");} } public class Test01 extends HelloA{public Test01(){System.out.println("I’m B class");}static{System.out.print…

用C语言实现贪吃蛇游戏!!!(破万字)

前言 大家好呀&#xff0c;我是Humble&#xff0c;不知不觉在CSND分享自己学过的C语言知识已经有三个多月了&#xff0c;从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容&#xff0c;也希望这些内容可以帮助到各位正在阅读的小伙伴…

【Vue】1-1、webpack的基本使用

一、什么是 Webpack 概念&#xff1a; webpack 是前端项目工程化的具体解决方案。 主要功能&#xff1a; 它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览器端 JavaScript 的兼容性、性能化等强大的功能。 好处&#xff1a; 让程序员把工作重心放到具…

JVM系列-7内存调优

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

课时5:编程语言解读

1.2.1 编程语言解读 学习目标 这一节&#xff0c;我们从 基础知识、编程语言、小结 三个方面来学习。 基础知识 程序 外在关系&#xff1a;业务数据&#xff1a;用户访问业务时候&#xff0c;产生的信息内容数据结构&#xff1a;静态的描述了数据元素之间的关系算法&#x…

PHP伪协议使用姿势

php支持的伪协议 1 file:// — 访问本地文件系统 2 http:// — 访问 HTTP(s) 网址 3 ftp:// — 访问 FTP(s) URLs 4 php:// — 访问各个输入/输出流&#xff08;I/O streams&#xff09; 5 zlib:// — 压缩流 6 data:// — 数据&#xff08;RFC 2397&#xff09; 7 glob:// —…

rqt查看rosbag中视频的方法

1. 播放bag视频 执行&#xff1a; rosbag play xxx.bag2. 打开rqt_image_view 执行&#xff1a; rqt_image_view3. 在选择话题处选择图片话题