Dijkstra求最短路(堆优化)

news2024/11/16 12:45:01

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

请你求出 1 号点到 n 号点的最短距离,如果无法从1 号点走到 n 号点,则输出 −1。

输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围

1≤n,m≤1.5×10^{5}1≤n,m≤1.5×10^{5},
图中涉及边长均不小于 0,且不超过10000。
数据保证:如果最短路存在,则最短路的长度不超过 10^{9}

输入样例:

3 3
1 2 2
2 3 1
1 3 4

输出样例: 

3

堆优化版的dijkstra是对朴素版dijkstra进行了优化,在朴素版dijkstra中时间复杂度最高的寻找距离最短的点O(n^2)可以使用最小堆优化。

1. 一号点的距离初始化为零,其他点初始化成无穷大。

2. 将一号点放入堆中。

3. 不断循环,直到堆空。每一次循环中执行的操作为:

弹出堆顶,迭代每个点到邻接点的最短距离,从距离最小的点开始走

用该点更新临界点的距离,若更新成功就加入到堆中。

#include<stdio.h>

#include<iostream>

#include<math.h>

#include<algorithm>

#include<queue>

#include<string.h>

using namespace std;

typedef pair<int,int> PII;

const int N=1000100;

int h[N],e[N],ne[N],idx;

int w[N],dist[N];

bool st[N];

int n,m;





void add(int x,int y,int c)

{

    w[idx]=c;

    e[idx]=y;

    ne[idx]=h[x];  

    h[x]=idx++;

}

 

int dis()// 迭代每个点到邻接点的最短距离,从距离最小的点开始走(

{

    memset(dist,0x3f,sizeof(dist));

    dist[1]=0;

    priority_queue <PII , vector<PII> , greater<PII>>p;

    p.push({0,1});

    while(p.size())

    {

        PII k=p.top();

        p.pop();

        int dis=k.first , xu=k.second;

        if(st[xu]) continue;

        st[xu] = true;

        for(int i = h[xu] ; i!=-1 ; i=ne[i])

        {

            int j=e[i];

            if(dist[j]>dis+w[i])

            {

                dist[j]=dis+w[i];

               p.push({dist[j],j});

            }

        }

    }

    if(dist[n]==0x3f3f3f3f) return -1;

    else return dist[n];

}



int main()

{

    memset(h,-1,sizeof(h));//初始化为-1

    cin>>n>>m;

    while(m--)

    {

        int x,y,c;

        cin>>x>>y>>c;

        add(x,y,c);

    }

    cout<<dis()<<endl;



    return 0;

}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《205.同构字符串、217. 存在重复元素、283. 移动零》。 目…

(十四)大白话磁盘文件中, 40个bit位的数据头以及真实数据是如何存储的?

文章目录 1、前情回顾2、详解40个bit位数据头1、前情回顾 之前我们已经给大家讲到了在磁盘上存储数据的时候, 每一行数据都会有变长字段长度列表,逆序存放这行数据里的变长字段的长度,然后会有NULL值列表,对于允许为NULL的字段都会有一个bit位标识那个字段是否为NULL,也是…

shell第五天作业——函数与数组

题目 一、编写函数&#xff0c;实现打印绿色OK和红色FAILED 二、编写函数&#xff0c;实现判断是否有位置参数&#xff0c;如无参数&#xff0c;提示错误 三、编写函数实现两个数字做为参数&#xff0c;返回最大值 四、编写函数&#xff0c;实现两个整数为参数&#xff0c;…

状态压缩DP——最短Hamilton路径

状态压缩DP——最短Hamilton路径一、题目描述二、思路分析1、状态转移方程&#xff08;1&#xff09;状态表示——状态压缩&#xff08;2&#xff09;状态转移2、循环和初始化&#xff08;1&#xff09;循环设计&#xff08;2&#xff09;初始化三、代码实现一、题目描述 二、思…

(day1)自学java基础

非原创&#xff0c;记录学习过程&#xff0c;为方便自己后期复习 目录 1.Java基础概念 2.运算符 3.判断 4.循环 5.循环高级 6.数组 7.数组的内存图 8.方法 ctrlaltL 自动格式化代码 为什么要配置环境变量&#xff1f; 我们想在任意目录都可以打开指定软件&#xff0c;就…

DDR3 数据传输(四)

目录 引言 AXI从侧接口参数 AXI从侧接口信号 参考说明 引言 前文链接&#x

巧用网络指数

哈喽&#xff0c;好久不见&#xff01;今天我们来一起聊聊网络指数。网络指数平台是以网民在线使用行为数据为基础&#xff0c;借助关键词表达的重要信息检索渠道&#xff0c;一定程度上可以反映某一话题的关注度&#xff0c;也可以帮助我们抓住所谓的“热点”。这里&#xff0…

源码编译mindspore,利用云服务器与wsl

文章目录tmux的使用利用WSL2设置交换空间通过编译产生的output安装tmux的使用 参考&#xff1a;https://blog.csdn.net/weixin_43922901/article/details/89230499 参考&#xff1a;http://www.ruanyifeng.com/blog/2019/10/tmux.html tmux用于远程编译&#xff0c;开启一个会…

2023第一天,给你们展示一下用Python实现自动答题

前言 python实现自动答题&#xff1f; 别管&#xff0c;我这就给你们展示一下 &#xff08;效果图看不了 不知道为什么说我违gui&#xff09;&#x1f625; 话不多说&#xff0c;咱就直接看代码吧 代码 准备模块 import requests import parsel from selenium import webd…

create-vite 源码解析它来喽

create-vite的源码很简单&#xff0c;只有一个文件&#xff0c;代码总行数400左右&#xff0c;但是实际需要阅读的代码大约只有200行左右&#xff0c;废话不多说&#xff0c;直接开始吧。 代码结构 create-vite的代码结构非常简单&#xff0c;直接将index.ts拉到最底下&#…

项目学习--谷粒商城

1. 微服务搭建 本地安装虚拟机&#xff0c;静态IP划分和docker的使用微服务功能模块介绍以及业务模块划分与抽取 2. 前端搭建 3. 后端业务代码完善 云储存OSS的整合与使用JSR303校验以及自定义分组校验 4. Elasticsearch学习 Elasticsearch的基础使用Elasticsearch字段ma…

volatile 详解

1. 前言 在并发编程的过程中&#xff0c;volatile属性非常重要。首先我们要了解并发编程的三大特性&#xff1a;可见性, 有序性, 原子性而我们今天的了解的volatile 就牵扯到可见性, 有序性。同时我也会从个人了解的角度给大家分析下&#xff0c;如果有什么不对的地方也希望大家…

物联网与射频识别技术,课程实验(一)

目录 &#xff08;1&#xff09;communication.py &#xff08;2&#xff09;Reader.py &#xff08;3&#xff09;Tag.py 实验1—— EPC C1G2标准下的标签状态转换仿真 实验说明&#xff1a; 利用Python或Matlab模拟C1G2标签的状态转换模型&#xff1b; 程序应能显示标签…

深度学习:01 神经网络与激活函数

目前&#xff0c;最广泛使用的定义是Kohonen于1988年的描述&#xff1a; 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。 目录 对神经网络的概述 神经网络的表示 激活函数 为什么激…

2022年总结:从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年&#xff0c;这一年对于我来说是十分重要的一年。在这一年里&#xff0c;我作为一名初二在校学生&#xff0c;在CSDN上发布…

【Linux 环境变量】环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

1.问题&#xff1a;为什么自己写的程序需要加上./才能执行&#xff0c;但是指令可以直接使用&#xff0c;例&#xff1a;ls -al&#xff1f; 因为&#xff1a;不加"./"执行程序的时候会按环境变量PATH里面的各个路径找到就正常执行&#xff0c;找不到就报错&#xff…

SQL笔试题总结

文章目录前言一、列转行题目&#xff1a;将表Student转化为下面的形式展示先放答案逐步剖析二、row_number() over() 的使用题目&#xff1a;统计订单交易表&#xff08;orders&#xff09;每个商品交易金额最高的那一条数据先放答案逐步剖析三、逐行累加题目&#xff1a;还是订…

✿✿✿JavaScript --- jQuery框架二

目 录 1.高级事件 (1)浏览器一打开自动触发我们绑定的事件 (2) Trigger 传递数据 (3)自定义事件 (4)trigger 简写方案 (5)triggerHandler() (6)trigger和triggerHandler的区别 (7)on off one 2.动画 (1)显示 隐藏 动画 (2)队列动画 (3)下滑 上卷 (4)淡入淡出…

Nacos启动出现Error creating bean with name ‘memoryMonitor‘ 、‘externalDumpService‘

目录 &#x1f9e1;问题 &#x1f9e1;解决方法 &#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0c;每天对ta说不尽情话&#xff01; &#x1f49f;好记性不如烂键盘&#x…

WSL2支持systemctl命令

文章目录背景相关知识systemdinit安装方法一&#xff1a;微软官方支持方法&#xff08;推荐&#xff09;方法二&#xff1a;安装daemonize实现参考背景 微软官方推出Windows Terminal第一时间&#xff0c;我就安装了这个终端软件。现在GitHub已经有86.8k星&#xff0c;且发布了…