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

server/2024/10/20 10:14:21/

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; // 起始点到自身的距离为0while (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为0initmp();// 读取边的信息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.ppmy.cn/server/127352.html

相关文章

专访 Bitlayer 联合创始人 Charlie:探索比特币 Layer2 技术的未来

整理&#xff1a;Tia&#xff0c;Techub News 在加密货币行业经历了近 10 年的风雨历程后&#xff0c;Bitlayer 联合创始人 Charlie Hu 凭借其在以太坊、波卡等顶级项目中的深厚经验&#xff0c;重新聚焦比特币生态&#xff0c;他与 Bitlayer 的另外一位联合创始人 Kevin He 通…

如何从硬盘恢复丢失/删除的视频

您是否想知道是否可以恢复已删除的视频&#xff1f; 幸运的是&#xff0c;您可以使用奇客数据恢复从硬盘驱动器、SD 卡和 USB 闪存驱动器恢复已删除的视频文件。 你有没有遇到过这样的情况&#xff1a;当你随机删除文件以释放空间时&#xff0c;你不小心按下了一些重要视频的…

华为昇腾CANN训练营2024第二季--Ascend C算子开发能力认证(中级)题目和经验分享

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 正文开始 华为昇腾CANN训练营2024第二季…

Zig开发环境搭建

简介 对于程序员来说&#xff0c;最重要的工具之一代码编辑器&#xff0c;一个好用的开发环境能编程过程无比顺畅丝滑&#xff0c;尤其是在学习Zig 这样的新编程语言时。而Visual Studio Code 开发环境就提供了最简单的设置&#xff0c;可以快速获得代码自动补全和代码生成等功…

k8s集群搭建(保姆级教程以及遇到的各种问题解决)

docker安装 1、移除以前docker相关包 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2、配置yum源 sudo yum install -y yum-utils sudo yum-config-manager \ …

opencv实战项目(三十):使用傅里叶变换进行图像边缘检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一&#xff0c;什么是傅立叶变换&#xff1f;二&#xff0c;图像处理中的傅立叶变换&#xff1a;三&#xff0c;傅里叶变换进行边缘检测&#xff1a; 一&#xff0c…

【Android】初级控件

像素 Android支持的像素单位有&#xff1a;px&#xff08;像素&#xff09;、in&#xff08;英寸&#xff09;、mm&#xff08;毫米&#xff09;、pt&#xff08;磅&#xff0c;1/72英寸&#xff09;、dp&#xff08;与设备无关的显示单位&#xff09;、dip&#xff08;就是dp…

如何快速自定义一个Spring Boot Starter!!

目录 引言&#xff1a; 一. 我们先创建一个starter模块 二. 创建一个自动配置类 三. 测试启动 引言&#xff1a; 在我们项目中&#xff0c;可能经常用到别人的第三方依赖&#xff0c;又是引入依赖&#xff0c;又要自定义配置&#xff0c;非常繁琐&#xff0c;当我们另一个项…