最短路-稀疏图-堆优化的dijstra算法-优先队列

news/2024/7/15 17:57:08 标签: 算法, 图论

优先队列
heap 堆 先进先出

队列里面的类型是pair,先比较第一个元素,第一个相同比较第二个

#include<queue>
//大的数排在前面 从大到小进行排列
typedef pair<int,int> PII;
priority_queue<PII,vector<PII>> q;
//从小到大进行排列
#include<queue>
typedef pair<int,int> PII;
priority_queue<PII, vector<PII>, greater<PII>q;

堆优化的dijkstra

1.用于稠密图
2. 和朴素的dijstra 算法的区别是使用了优先队列
3. 时间复杂度(mlogn)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

const int N = 150010;

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

int dist[N];

bool vis[N];

typedef  pair<int,int> P;


int n;
// 堆优化dijkstra 用邻接表存图

void add(int a, int b, int c){
    e[idx] = b;
    w[idx] = c;
    ne[idx] = h[a];
    h[a] = idx++;

}

int dijkstra(){
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0; 
    
    //优先队列
    priority_queue<P,vector<P>, greater<P>>q;
    q.push({0,1});
    while(q.size()){
        
        //找到最小的点
        auto t = q.top();
        q.pop();
        
        int dis = t.first, ver = t.second;
        if(vis[ver]) continue;
        vis[ver] = true;
        
        //进行更新
        for(int i = h[ver]; i != -1; i = ne[i]){
            int j = e[i];
            if((dist[j] > dis + w[i]) && !vis[j]){
                
                dist[j] = dis + w[i]; 
                q.push({dist[j], j});
            }
            
        }
        
    }
    // cout<<dist[n] << '\n';
    if(dist[n] == 0x3f3f3f3f){
        return -1;
    }else return dist[n];
    
    

}





int main(){
    int m;
    cin>>n>>m;
    memset(h, -1, sizeof h);
    int x,y,z;
    for(int i = 0; i < m; i++){
        cin>>x>>y>>z;
        add(x,y,z);
    }
    
    int ans = dijkstra();
    cout<<ans<<'\n';
    
    
    
    return 0;
}

http://www.niftyadmin.cn/n/4984996.html

相关文章

win10+QT5.15+cryptopp562 完整配置开发

1、准备如下几项内容: a、WIN10环境下的QT5.15.2安装包,QTCreator对应版本安装。(自行安装) b、cryptopp562安装包下载,官网:https://www.cryptopp.com/,这里没选择最新的8.7是因为mingw-32编译后的库文件使用有问题,有错误,但是5.6用同样的方式编译就可以正常使用。 …

Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin

Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.RE…

nlohmann json:实现map和struct的互转

可以借助json实现map和struct的互转: #include <iostream> #include <string> #include <variant> #include <nlohmann/json.hpp> using namespace std; using json = nlohmann::json;using VDdata = variant<int, string>; using MData = map…

kind搭建k8s集群用于测试

安装kind 需要先安装go kind基于go开发 #修改go源加快下载速度 go env -w GOPROXYhttps://goproxy.cn,direct #直接下载安装kind最新版本 go install sigs.k8s.io/kindlatest #进入GOPATH目录找到bin目录下kind执行程序 移动到环境变量里 mv ./kind /usr/local/bin/ #提前下载…

pdf转换成图片转换器在线怎么转?pdf转换成图片具体方法介绍

很多用户们都是比较喜欢使用pdf文档的&#xff0c;由于这种文件格式的便携性非常高&#xff0c;所以广泛的应用于工作和学习领域&#xff0c;再加上pdf文档可以随意转换成为其他的文件格式&#xff0c;更是让pdf文档受到了更多用户们的欢迎&#xff0c;那么pdf转换成图片转换器…

从零开始探索C语言(三)----运算符和判断语句

文章目录 1. C 运算符1.1 算术运算符1.2 关系运算符1.3 逻辑运算符1.4 位运算符1.5 赋值运算符1.6 杂项运算符 ↦ sizeof & 三元1.7 C 中的运算符优先级 2. C 判断2.1 if 语句2.2 if...else 语句2.3 if...else if...else 语句2.4 ? : 运算符(三元运算符) 1. C 运算符 运算…

Python爬虫框架之Selenium库入门:用Python实现网页自动化测试详解

概要 是否还在为网页测试而烦恼&#xff1f;是否还在为重复的点击、等待而劳累&#xff1f;试试强大的Selenium&#xff01;让你的网页自动化测试变得轻松有趣&#xff01; 一、Selenium库到底是什么&#xff1f; Selenium 是一个强大的自动化测试工具&#xff0c;它可以让你直…

【MYSQL学习笔记】管理MYSQL和使用MYSQL语句

一、前言 MySQL提供了大量的SQL语句用于管理。很多时候&#xff0c;通过SSH远程连接时&#xff0c;只能使用SQL命令&#xff0c;所以&#xff0c;了解并掌握常用的SQL管理操作是必须的。 二、管理MYSQL 输入SQL后&#xff0c;记得加一个;&#xff0c;再回车执行该语句。虽然…