Dijkstra求最短路 — 朴素/堆优化 + 模拟邻接表 及 遍历

news2024/11/15 13:50:58

Dijkstra求最短路

在这里插入图片描述
给定一个 n个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

在这里插入图片描述

朴素dijkstra

#include<iostream>
#include<fstream>
#include<cstring>
#include<stdio.h>

using namespace std;

const int N = 1e3+10;
int g[N][N];//邻接矩阵
int dis[N];//起点到某个点的距离
int st[N];//已确定的点
int n,m;//n个点 m条边


int dijkstra(int u){
        memset(dis,0x3f,sizeof dis);//初始距离为无穷
        dis[u] = 0;

        for(int i = 1;i <= n;i++){//遍历所有的顶点
            /**
             *Extract-Min操作
             */            
            int t = -1;//选择下一个顶点
            for(int j = 1;j <= n;j++){//找出当前点最短的出边的下一个顶点
                if(!st[j] && (t == -1 || dis[j] < dis[t])){//j顶点不在S集合 并且t未确定或者t确定但找到j距离小于t
                    t = j;
                }
            }
            st[t] = 1;//循环结束后 t也就确定了  将t加入S集合
            
            /**
             * Relax操作
             * 因为S集合增加了新的点
             * 所以更新每个点的最短距离
             */
             for(int i = 1;i<=n;i++){//找一个点,如果先到t再到i的距离比原来直接到i更短,就替换该距离
                 dis[i] = min(dis[i], dis[t] + g[t][i]);
             }
             
        }

     
    if(dis[n] > 10000){//说明1无法到达n
        return -1;
    }
    
    return dis[n];
}

int main(){
    memset(g,0x3f,sizeof g);//初始化所有边长均为正无穷
    cin>>n>>m;
    //因为可能存在重边,所以u到v的重边只要保留最短边即可
    int x,y,z;
    for(int i = 1;i<=m;i++){
        cin>>x>>y>>z;
        g[x][y] = min(g[x][y],z);
    }
    
    cout<<dijkstra(1);
    return 0;
}

堆优化dijkstra

在这里插入图片描述

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

typedef pair<int,int> pii;

const int N = 1e5+10;
//稀疏图用邻接表,并且这么大的N如果直接开数组,二维数组会报错
int h[N], e[2*N], ne[2*N], w[2*N];//多一个权值
int idx;

int dis[N];//起点到某点的距离
priority_queue<pii,vector<pii>,greater<pii>> heap;//小顶堆  队头是距离最小的元素
int st[N];//如果有重边,在添加过程中就会出现重复的边在堆内,但由于会优先取最小距离的边,所以冗余边没关系
int n,m;

void add(int a,int b, int c){//添加a到b的边 权值为c
    e[idx] = b;
    w[idx] = c;
    ne[idx] = h[a];
    h[a] = idx++; 
}

int dijkstra(int u){
    memset(dis,0x3f,sizeof dis);
    dis[u] = 0;
    heap.push({0,1});
    
    while(!heap.empty()){
        auto t = heap.top();
        heap.pop();
        int ver = t.second, distance = t.first;//距离
        if(st[ver]) continue;//冗余边,已经访问过,可以跳过,因为每次优先取更小的边,访问到已访问过的说明这次的距离更大
        st[ver] = 1;//标记访问过的边
        
        /**
        *把Extract-Min操作和Relax操作一起完成了
        */
        for(int i = h[ver];i != -1;i = ne[i]){
            int j = e[i];//取编号
            /**
             *distance为起点到ver的距离 , w[i]为ver到e[i]的的距离 
             *如果 起点直接到j距离 比 起点到ver再到e[i] 更远,那么就更新dis[j]
             */
            dis[j] = min(dis[j],distance + w[i]);
            heap.push({dis[j],j});//可以直接添加,冗余的会跳过
        }
        
    }
    if(dis[n] == 0x3f3f3f3f) return -1;
    return dis[n];
}


int main(){
    memset(h,-1,sizeof h);
    cin>>n>>m;
    int x,y,z;
    
    while(m--){
        cin>>x>>y>>z;
        add(x,y,z);
    }
    
    cout<<dijkstra(1);
    return 0;
}

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

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

相关文章

PTA——L1-027 出租分数 20

下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应 arr[3]0&…

路径规划算法:基于寄生捕食优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于寄生捕食优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于寄生捕食优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

【Java基础教程】(五)程序概念篇 · 下:夯实基础!全面解析Java程序的逻辑控制体:顺序、选择与循环结构~

Java基础教程之程序概念 下 本节学习目标1️⃣ 程序逻辑控制1.1 顺序结构1.2 分支结构1.2.1 if 选择结构1.2.2 switch 选择结构 1.3 循环结构1.3.1 while 循环1.3.2 for 循环1.3.3 循环控制 &#x1f33e; 总结 本节学习目标 掌握Java中分支结构、循环结构、循环控制语法的使…

前端js代码一句话模拟Ctrl+A全选网页内容效果document.execCommand(‘selectAll‘);

document.execCommand(selectAll);//命令不区分大小写 document.execCommand(aCommandName, aShowDefaultUI, aValueArgument) aCommandName&#xff1a;命令名称 aShowDefaultUI&#xff1a;交互方式&#xff0c; Boolean值&#xff0c;true的话将显示对话框&#xff0c;如…

Oracle11g 64位下载

下载地址 http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_1of2.ziphttp://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_2of2.zip如果下载出现如下错误页面 这时候可以登录oracle官网&#xff0c;随意点击一个下载&am…

基于qrencode实现linux打印二维码

一、概述 在Centos 7环境的控制台打印二维码。 二、实现方式 1.安装qrencode工具 sudo yum install -y qrencode 2.命令 echo "你的字符串" | qrencode -t UTF8三、展示

山海鲸Cesium:帮你用更简单的方式升级视效

CesiumJS作为绝大多数人都在用的开源地球可视化引擎&#xff0c;视觉效果并不拔尖&#xff0c;这让很多giser都想着有一天升级一下视效&#xff0c;从众多平庸的项目中脱颖而出。然而&#xff0c;对于一些使用Cesium的项目来说&#xff0c;要想达到Cesium for unreal的视觉效果…

2023年智能制造与自动化前沿国际会议 | Ei Scopus双检索

会议简介 Brief Introduction 2023年智能制造与自动化前沿国际会议&#xff08;CFIMA 2023&#xff09; 会议时间&#xff1a;2023年11月3 -5日 召开地点&#xff1a;中国天津 大会官网&#xff1a;www.cfima.org 随着全球新一轮科技革命和产业变革突飞猛进&#xff0c;新一代信…

100天精通Golang(基础入门篇)——第15天:深入解析Go语言中函数的应用:从基础到进阶,助您精通函数编程!(进阶)

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

论文学习——U-Net: Convolutional Networks for Biomedical Image Segmentation

UNet的特点 采用端到端的结构&#xff0c;通过FCN&#xff08;最后一层仍然是通过卷积完成&#xff09;&#xff0c;最后输出图像。通过编码&#xff08;下采样&#xff09;-解码&#xff08;上采样&#xff09;形成一个“U”型结构。每次下采样时&#xff0c;先进行两次卷积&…

3D格式转化工具HOOPS Exchange的功能特点

​领先的CAD导入和导出库 使用用于CAD数据转换的HOOPS Exchange SDK将30多种CAD文件格式导入到您的应用程序中&#xff0c;具有对2D和3D CAD文件格式&#xff08;包括 CATIA、SOLIDWORKS、Inventor™、Revit™、Creo、 NX™、Solid Edge 等&#xff0c;全部通过单个API实现。 …

aop拦截所有请求并打印请求方法参数

效果图 代码 package com.hxnwm.ny.diancan.common.aspect;import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annota…

redis的主从复制、哨兵模式和集群模式搭建

概述 redis主从复制搭建 主从复制的作用 主从复制流程 搭建Redis 主从复制 修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 修改 Redis 配置文件&#xff08;Slave节点操作&#xff09; 验证主从效果 ​编辑 Redis 哨兵模式 哨兵模式的作用 故障转移机制 …

idea切换Git分支时保存未提交的文件

问题描述 现在需要开发一个新功能A时&#xff0c;我们需要从Dev分支上创建一个新的功能分支tenant&#xff0c;然后我们就在这个分支上进行开发。假设有一天&#xff0c;你正在开发&#xff0c;本地已经在tenant上修改了几个文件&#xff0c;但是功能还没有完全开发完成&#…

游戏反调试方案解析与frida/IDA框架分析

近来年&#xff0c;游戏黑灰产攻击趋势呈现出角度多样化的特点。据FairGuard游戏安全数据分析发现&#xff0c;游戏黑灰产攻击以工作室、定制注入挂、内存修改器、模拟点击、破解等形式为主。 游戏安全风险分布占比图 对于一款游戏而言&#xff0c;上述的风险中&#xff0c;被…

Kubernetes(k8s)实战:深入详解Volume,详解k8s文件同步存储

文章目录 一、Volume1、什么是Volume2、Host类型volume实战&#xff08;不推荐&#xff09;&#xff08;1&#xff09;小总结 二、PersistentVolume持久化volume&#xff08;推荐&#xff09;1、什么是PersistentVolume2、什么是PersistentVolumeClaim3、Pod中如何使用PVC 三、…

初中学物理实验室教学装备配置标准

初中物理实验室建设&#xff0c;以现行义务教育物理教科书为基本参照&#xff0c;以学生学科核心素养发展为基本遵循&#xff0c;以加强实验等实践性教学活动&#xff0c;落实立德树人根本任务为目标。因此&#xff0c;初中物理实验室的建设实施过程中&#xff0c;需结合校情、…

PCB封装设计指导(三)如何创建PAD

PCB封装设计指导(三)如何创建PAD 当我们完全看完了Datasheet之后,确定了需要建立的封装类型,以及尺寸之后,这一步就可以开始创建封装的PAD了。 下面介绍如何创建各种类型的PAD和一些技巧和注意点,包括创建flash的注意事项。 1.如何创建PAD 1. 打开pad designer ,根据尺…

STL源码刨析 string实现

目录 一. string 类介绍 二. string 的简单实现 1. 类内成员变量 2. Member functions string ~string operator string(const string& str) 3. Capacity size capacity empty clear reserve resize 4.Modifiers push_back append operator insert era…

【回溯算法part05】| 491.递增子序列、46.全排列、47.全排列||

目录 &#x1f388;LeetCode491.递增子序列 &#x1f388;LeetCode46.全排列 &#x1f388;LeetCode47.全排列|| &#x1f388;LeetCode491.递增子序列 链接&#xff1a;491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xf…