dijstra算法——单元最短路径算法

news2024/11/28 2:55:25

Dijkstra算法

用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。Dijkstra的时间复杂度是O(n^2),它不能处理存在负边权的情况。

算法描述:

设起点为s,dis[v1表示从s到v的最短路径长度

(1).初始化:dis[v]=(vs);dis[s]=0

(2).for (i = 1;i<= n ;i++)

1.在没有被访问过的点中找一个顶点u使得dis[ul是最小的。
2.u标记为已确定最短路径
3.for与u相连的每个未确定最短路径的顶点v
if (dis[u]+w[u][v] < dis[v])
{
    dis[v] = dis[u] + w[u][v]}

(3)算法结束:dis[v]为s到v的最短距离;

在这里插入图片描述
我们来看个例子:
在这里插入图片描述
我们来做到题练习一下:https://acm.hdu.edu.cn/showproblem.php?pid=2544

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

#define INF 0x3f3f3f3f // 定义一个代表无穷大的常量
const int M = 1e4 + 10; // 最大边数
const int N = 1e3 + 10; // 最大节点数

int n, m; // n为节点数,m为边数
int mp[N][N]; // 图的邻接矩阵
int dis[N]; // 存储最短路径的数组
bool vis[N]; // 存储每个节点是否被访问的数组

void initmp()
{
    memset(mp, INF, sizeof(mp));
}

void dijkstra(int s) {
    memset(vis, 0, sizeof(vis)); // 初始化访问数组,0表示未访问,1表示已访问
    memset(dis, 0x3f, sizeof(dis)); // 初始化最短路径数组为无穷大
    dis[s] = 0; // 起始点到自身的距离为0

    while (1) {

        int mini = 0, min_ = INF; // 用于记录当前最小距离的节点
        for (int j = 1; j <= n; j++) {
            // 找到未访问的节点中距离起始点最近的节点
            if (!vis[j] && min_ > dis[j]) {
                mini = j;
                min_ = dis[j];
            }
        }
        // 如果没有找到未访问的节点,说明结束
        if (mini == 0) {
            break;
        }
        vis[mini] = 1; // 将当前节点标记为已访问
        for (int i = 1; i <= n; i++) {
            // 如果节点i未访问且通过mini节点到达i的距离小于当前已知的距离,则更新距离
            if (!vis[i] && dis[i] > dis[mini] + mp[mini][i]) {
                dis[i] = dis[mini] + mp[mini][i];
            }
        }
    }
}

int main() {
    // 初始化邻接矩阵为无穷大
    memset(mp, INF, sizeof(mp));
    while (scanf("%d%d", &n, &m) != EOF && n) { // 读取节点数和边数,直到n为0
        initmp();
        // 读取边的信息
        for (int i = 0; i < m; i++) {
            int u, v, w;
            cin >> u >> v >> w;
            // 更新邻接矩阵,取最小边权
            if (mp[u][v] > w) {
                mp[u][v] = mp[v][u] = w;
            }
        }
        dijkstra(1); // 从节点1开始计算最短路径
        cout << dis[n] << endl; // 输出从节点1到节点n的最短路径
    }
    return 0;
}

为什么不能处理负权边
在这里插入图片描述

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

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

相关文章

云原生(四十六) | MySQL软件安装部署

文章目录 MySQL软件安装部署 一、MySQL软件部署步骤 二、安装MySQL MySQL软件安装部署 一、MySQL软件部署步骤 第一步&#xff1a;删除系统自带的mariadb 第二步&#xff1a;下载MySQL源&#xff0c;安装MySQL软件 第三步&#xff1a;启动MySQL&#xff0c;获取默认密码…

【无标题】提升快递管理效率的必备技能:教你批量查询与导出物流信息

在当今快节奏的商业环境中&#xff0c;快递与物流行业的效率直接关系到企业的运营成本和客户满意度。随着订单量的不断增加&#xff0c;如何高效地管理和追踪大量的物流信息成为了企业面临的一大挑战。批量查询与导出物流信息作为一种高效的数据处理手段&#xff0c;正逐渐成为…

信息安全工程师(33)访问控制概述

前言 访问控制是信息安全领域中至关重要的一个环节&#xff0c;它提供了一套方法&#xff0c;旨在限制用户对某些信息项或资源的访问权限&#xff0c;从而保护系统和数据的安全。 一、定义与目的 定义&#xff1a;访问控制是给出一套方法&#xff0c;将系统中的所有功能和数据…

ElliQ 老年身边的陪伴

前记 国庆回家发现爸爸之前干活脚崴了&#xff0c;找个临时拐杖撑住&#xff0c;我心里很不是滋味。虽然总和爸妈说&#xff0c;不要干重活&#xff0c;但老人总是担心成为儿女的负担&#xff0c;所以只要能动&#xff0c;就找活干。 给爸妈一点零花钱&#xff0c;老妈只收了…

多系统萎缩患者的运动指南【健康守护,动出希望】

亲爱的朋友们&#xff0c;今天我们来聊聊一个特别而重要的话题——多系统萎缩患者的运动指南。面对这一挑战&#xff0c;适量的运动不仅能缓解病情&#xff0c;还能提升生活质量。让我们一起&#xff0c;用爱与坚持&#xff0c;为生命加油&#xff01; &#x1f308; ‌为什么…

Linux系统字符命令关机方法对比

一、相同点&#xff1a;都可以达到关机或重启系统的目的。 二、不同点&#xff1a;命令内部的工作过程不同。 1、shutdown 安全的关机命令&#xff1a;系统管理员会通知所有登录的用户系统将要关闭且 login 指令会被冻结&#xff0c;即新的用户不能再登录。根据使用的参数不同…

Spring Boot RESTful API开发教程

一、RESTful API简介 RESTful API是一种基于HTTP协议的Web API&#xff0c;其设计原则是简单、可扩展、轻量级、可缓存、可靠、可读性强。RESTful API通常使用HTTP请求方法&#xff08;GET、POST、PUT、DELETE等&#xff09;来操作资源&#xff0c;使用HTTP状态码来表示操作结…

SysML案例-电磁轨道炮

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 图片示例摘自intercax.com&#xff0c;作者是Intercax公司总裁Dirk Zwemer博士。

【需求分析】软件系统需求设计报告,需求分析报告,需求总结报告(原件PPT)

第1章 序言 第2章 引言 2.1 项目概述 2.1.1 项目背景 2.1.2 项目目标 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 3.1.1 接口要求 3.1.2 系统专有技术 3.1.3 查询功能 3.1.4 数据安全 3.1.5 可靠性要求 3.1.6 稳定性要求 3.1.7 安全性…

车载入行:HIL测试、功能安全测试、CAN一致性测试、UDS测试、ECU测试、OTA测试、TBOX测试、导航测试、车控测试

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架

Streamlit 是一个开源的 Python 库&#xff0c;专为数据科学家和机器学习开发者设计&#xff0c;旨在快速构建数据应用。通过简单的 Python 脚本&#xff0c;开发者无需掌握前端技术&#xff0c;即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…

SOMEIP_ETS_164: SD_SubscribeEventgroup_with_unallowed_option_ip_2

测试目的&#xff1a; 验证DUT能够拒绝一个在请求中包含错误参数&#xff08;端点选项中包含无效IPv4地址&#xff0c;即111.111.111.111&#xff09;的SubscribeEventgroup消息&#xff0c;并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协…

自动驾驶系列—线控悬架技术:自动驾驶背后的动力学掌控者

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【Java并发编程的艺术3】Java内存模型(上)

文章目录 Java内存模型的基础并发编程模型的两个关键问题通信同步 Java内存模型的抽象结构并发编程模型的分类happens-before简介 Java内存模型的基础 并发编程模型的两个关键问题 在并发编程中&#xff0c;需要处理两个关键问题&#xff1a;线程之间如何通信以及线程之间如何…

JavaScript 中最快的循环是什么?

无论使用哪种编程语言&#xff0c;循环都是一种内置功能。JavaScript 也不例外&#xff0c;它提供了多种实现循环的方法&#xff0c;偶尔会给开发人员带来困惑&#xff1a;哪一种循环才是最快的&#xff1f; 以下是Javascript中可以实现循环的方法&#xff1a; For Loop While …

【GEE学习第三期】GEE常用函数总结

【GEE学习第三期】GEE常用函数总结 数据统计类ee.List.sequence函数 图像处理类ee.Geometry类‌defaultVisualizationVis函数 数据输入输出数值与绘图导出影像 参考 数据统计类 ee.List.sequence函数 用法如下&#xff1a; ee.List.sequence &#xff08;开始&#xff0c;结…

FFT 分析进阶-笔记

FFT 分析进阶 边界不连续与泄漏效应解决方法增加窗函数海宁窗与哈布什窗混叠效应频率高到什么程度会出现混叠现象呢&#xff1f;那我们有办法去应对这个混叠吗&#xff1f;经典平均指数平均关于结果的显示模式FFT计算的三个常见的范例计算FFT图谱中某一段的总值&#xff0c;图中…

已解决:ValueError: Shape of passed values is (1509, 1), indices imply (1509, 2)

已解决&#xff1a;ValueError: Shape of passed values is (1509, 1), indices imply (1509, 2) 文章目录 写在前面问题描述报错原因分析&#xff1a; 解决思路解决办法1. 确认并调整数据的形状2. 使用 pd.concat() 或 pd.merge() 时检查数据3. 确保赋值时数据的形状匹配4. 重…

《PMI-PBA认证与商业分析实战精析》第7章 解决方案评价

第7章 解决方案评价 本章主要内容&#xff1a; 评价的建议思维 解决方案的评价计划 确定评价什么 何时以及如何验证解决方案的结果 评价验收标准和解决缺陷 促进通过/不通过的决策 获得解决方案的签字确认 评价解决方案的长期绩效 解决方案替换/淘汰 本章涵盖的考试…

DT高清车牌识别摄像机 任意文件读取

0x01 产品描述&#xff1a; DT-高清 车牌识别摄像机是一款先进的安防设备&#xff0c;采用高清图像传感器和先进的识别算法&#xff0c;能够精准、快速地识别车牌信息。其高清晰该摄像机结合了智能识别技术&#xff0c;支持实时监宴图像质量确保在各种光照和天气条件下都能准确…