算法刷题笔记 Dijkstra求最短路(C++实现)

文章目录

    • 题目描述
    • 基本思路
    • 实现代码

题目描述

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

输入格式

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

输出格式

  • 输出一个整数,表示1号点到n号点的最短距离。
  • 如果路径不存在,则输出−1

数据范围

  • 1 ≤ n ≤ 500,
  • 1 ≤ m ≤ 10^5,
  • 图中涉及边长均不超过10000

基本思路

  • 迪杰斯特拉算法是一种常用的有向图求最短路径的方法。本题的代码中给出了非常详细的注释和清晰的逻辑实现,因此具体思路请参见本篇文章的代码部分即可。

实现代码

#include <cstdio>
#include <vector>
// 导入climits头文件是为了使用其中的最大整型数值INT_MAX,可以被视为路径长度的上限
#include <climits>  
using namespace std;// 【变量定义】输入的有向图中点的数量和边的数量
int n, m;
// 【辅助结构体定义】定义带权有向边结构体
struct edge_with_weight
{int end;     // 有向边的终点int weight;  // 有向边的权重
};
// 【常量定义】有向图中点的数量上限
const int N = 510;
// 【变量定义】表示有向图的邻接表的向量数组
vector<edge_with_weight> adjacent_table[N];
// 【变量定义】用于记录起点到每一个点在当前步骤的最短路径长度的数组(INT_MAX表示还没有找到路径)
int path_length[N]; 
// 【变量定义】用于记录有向图中每一个点是否已经找到最短路径的数组
bool determined[N];// 【函数定义】该函数输入有向图中起点和终点的编号,输出最短路径长度(如果不存在则输出-1)
void shortest_path(int start, int end)
{// 【初始化】将起点到自身的最短路径初始化为0,并将其设置为已经确定了最短路径长度path_length[start] = 0;determined[start] = true;// 【算法主体】通过一个循环语句进行遍历for(int i = 0; i < n; ++ i){// 取出当前点的所有出边for(edge_with_weight edge : adjacent_table[start]){// 【分情况讨论】判定该有向边的终点是否已经确定了最短路径长度,如果已经确定了则跳过if(determined[edge.end] == true) continue;// 当前有向边的终点还没有确定最短距离else{// 记录从起点到这条边的终点的距离int distance = path_length[start] + edge.weight;// 【分情况讨论】如果更新后的距离比起点到终点原先的最短路径更短,则更新终点的最短路径长度if(distance < path_length[edge.end]) path_length[edge.end] = distance;}}// 【变量定义和初始化】最短路径长度的值和对应的终点int shortest_path_length = INT_MAX;int shortest_path_index = -1;// 通过循环查找最短路径长度的值和对应的终点for(int i = 1; i < n; ++ i){// 跳过已经确定了最短路径长度的点if(determined[i] == true) continue;// 对于没有确定最短路径长度的点,则进行比较,找出较小的一个else{if(shortest_path_length > path_length[i]){shortest_path_length = path_length[i];shortest_path_index = i;}}}// 将当前具有最短路径长度的点作为下一个起点,并将该点设置为已确定最短路径长度start = shortest_path_index;determined[shortest_path_index] = true;}// 如果终点对应的最短路径仍然是INT_MAX,说明起点无法到达终点,返回-1if(path_length[end] == INT_MAX) printf("-1");// 如果终点对应的最短路径已经不是INT_MAX,说明起点可达终点并且已经获得了起点到终点的最短路径,返回结果else printf("%d", path_length[end]);
}int main(void)
{// 【输入部分】输入有向图中点的数量和边的数量scanf("%d%d", &n, &m);// 输入每一条带权边的信息for(int i = 0; i < m; ++ i){int x, y, z;scanf("%d%d%d", &x, &y, &z);// 将带权边的信息使用邻接表存储起来adjacent_table[x].push_back({y, z});}// 【初始化部分】将初始情况下每一个点的最短路径都初始化为INT_MAX(注意本题中点的下标从1开始)for(int i = 1; i <= n; ++ i) path_length[i] = INT_MAX;// 【处理和输出部分】调用自定义的函数,输出该有向图中从1号点到n号点的最短路径长度(如果不存在输出-1)shortest_path(1, n);return 0;
}

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

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

相关文章

使用Docker搭建MySql的主从同步+ShardingSphere搭建Mysql的读写分离

参考课程 尚硅谷ShardingSphere5实战教程&#xff08;快速入门掌握核心&#xff09;_哔哩哔哩_bilibili 主服务器 创建容器 docker run -d \ -p 3306:3306 \ -v /kira/mysql/master/conf:/etc/mysql/conf.d \ -v /kira/mysql/master/data:/var/lib/mysql \ -e MYSQL_ROOT…

QtQuick-QML类型系统-对象特性(id和属性)

每一个QML对象类型都包含一组定义好的特性。 每个对象类型的实例在创建时都会包含一组特性&#xff0c;这些特性是在该对象类型中定义的。一个QML文档中的对象声明定义了一个新的类型&#xff0c;其中可以包含如下特性&#xff1a; id特性属性&#xff08;property&#xff0…

(day26)leecode热题——找到字符串中所有字母异位词

描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "cbaebabacd", p …

Kubernets——常用命令

Kubernets命令总结 命令说明 命令格式命令说明kubectl run 资源名称 -参数 --image镜像名称:标签创建资源对象&#xff0c;常用参数-i交互&#xff0c;-t终端kubectl get 查询资源 可选参数 -o wide 显示主机信息常用查询的资源 node|deployment|podkubectl exec -it 容器id …

【Git-驯化】一文搞懂git中代码冲突的解决方案大全

【Git-驯化】一文搞懂git中代码冲突的解决方案大全 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a…

[C++实战]日期类的实现

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

ELK安装(Elasticsearch+Logstash+Kibana+Filebeat)

一、简介 1.1、软件简介 ELK其实是Elasticsearch&#xff0c;Logstash 和 Kibana三个产品的首字母缩写&#xff0c;这三款都是开源产品。 1.1.1、Elasticsearch简介 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析…

springboot微信老人健康与饮食管理系统-计算机毕业设计源码82939

基于微信老人健康与饮食管理系统的小程序 摘 要 基于Spring Boot的微信老人健康与饮食管理系统的小程序致力于为老年人提供便捷的健康管理和饮食指导服务。该小程序整合了健康资讯浏览、食谱推荐、健康评估等功能模块&#xff0c;通过系统的设计与实现&#xff0c;旨在帮助老年…

古丝绸之路传闻二:十年败壳精灵显,一介穷神富贵来

古丝绸之路传闻二&#xff1a;十年败壳精灵显&#xff0c;一介穷神富贵来 &#xff08;接上节&#xff1a;古丝绸之路传闻&#xff1a;分内功名匣里财&#xff0c;不关聪慧不关呆&#xff09; 先别说闲话。且说众人带着经纪主人到船上发货&#xff0c;文若虚把之前的事情说了一…

AccessLog| 一款开源的日志分析系统

前言 ClkLog作为分析系列产品中的前端数据分析系统&#xff0c;通过采集前端应用数据进行用户行为分析。其社区版从23年9月发布至今已有近一年&#xff0c;商业版也上线快半年&#xff0c;感谢大家一直以来的关注和支持&#xff0c;ClkLog会继续做好产品升级与服务&#xff0c;…

Linux冯诺依曼体系、操作系统、进程概念、进程状态、进程切换

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;Linux 目录 一、冯诺依曼体系结构 二、操作系统 1、概念 2、为什么要有操作系统&#xff1f; 3、理解操作系统 1.管理的本质 2.管理的概念 3.操作系统结构图 4.为什么要有操作系统&#xff1f; 三…

ASP.NET Core Web深度探讨

ASP.NET Core作为现代Web开发的基石&#xff0c;以其跨平台、高性能和模块化设计的特点&#xff0c;成为许多开发者的首选框架。本文将深入探讨ASP.NET Core在Web开发中的应用&#xff0c;包括MVC、Razor Pages、Blazor等框架的使用&#xff0c;以及路由、中间件、身份认证、会…

golang websocket 手写研究机制

// 处理ws请求 func WsHandler(w http.ResponseWriter, r *http.Request, id string) {var conn *websocket.Connvar err errorpingTicker : time.NewTicker(time.Second * 10)conn, err wsupgrader.Upgrade(w, r, nil)if err ! nil {log.Printf("Failed to set websocke…

python-NLP:2词性标注与命名实体识别

文章目录 词性标注命名实体识别时间命名实体&#xff08;规则方法&#xff09;CRF 命名实体识别方法 词性标注 词性是词汇基本的语法属性&#xff0c;通常也称为词类。词性标注是在给定句子中判定每个词的语法范畴&#xff0c;确定其词性并加以标注的过程。例如&#xff0c;表示…

Python机器学习实战:分类算法之逻辑回归-泰坦尼克号乘客生还预测

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 目录 逻辑回归算法介绍 练习题 Python代码与分析 1、读入数据&#xff0c;观察数据情况 2、各属性与生还情况的关联 3、…

用Python做一个翻译软件,比上浏览器快100倍

简单的用Python来做一个翻译软件 开发环境 Python 3.10 Pycharm模块使用 requests -> pip install requests hashlib tkinter案例分为三部分: 1. 爬虫: 获取翻译接口, 请求获取翻译结果问题1: 接口抓包分析问题2: 请求需要写cookie问题3: 不同文本翻译, s加密参数2. 界面…

国科大作业考试资料-人工智能原理与算法-2024新编-第十二次作业整理

袋子里面有3个有偏差的硬币a、b和c,抛掷硬币正面朝上的概率分别是20%、60%和80%。从袋 子里随机取出一个硬币(3个硬币被取出的概率是相等的),并把取出的硬币抛掷3次,得到抛掷结 果依次是X1 , X2和 X3。 a. 画出对应的贝叶斯网络并定义必要的CPT表。 b. 如果抛掷结果是…

PDF解锁网站

https://smallpdf.com/cn/unlock-pdfhttps://smallpdf.com/cn/unlock-pdfhttps://www.freemypdf.comhttps://www.freemypdf.com

【python】python图书管理系统_普通用户+管理员菜单(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

vue vite开发环境https接口代理无法访问的问题

一、问题现象 本地请求是所有的接口前边只需要加一个前缀即可 —— /local/。比如登录接口就是 ‘/local/login’。于是去请求发现直接报错了&#xff0c;报错信息如下&#xff1a; 使用接口代理https接口请求&#xff0c;访问报错的问题&#xff0c;提示如下&#xff1a; http…