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

embedded/2024/10/5 18:09:11/

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/embedded/123491.html

相关文章

初识TCP/IP协议

回顾上文 来回顾一下TCP协议的特性&#xff0c;有一道比较经典的题&#xff1a;如何使用UDP实现可靠传输&#xff0c;通过应用程序的代码&#xff0c;完成可靠传输的过程&#xff1f; 原则&#xff0c;TCO有啥就吹啥&#xff0c;引入滑动窗口&#xff0c;引入流量控制&#x…

SDKMAN!安装Maven

一、通过SDKMAN!正常安装 查看maven版本 sdk list maven安装maven 3.6.3版本 sdk install maven 3.6.3查看maven 3.6.3安装目录 sdk home maven 3.6.3安装过程中可能会失败&#xff0c;出现tmp临时目录中存在临时文件 # 移除临时文件&#xff0c;不要手动删除&#xff0c;…

组合式API

1.入口&#xff1a;setup setup中的数据和方法必须return出去&#xff0c;模板才能使用 <script> export default {setup () {console.log(setup);const message this is a messageconst logMessage () > {console.log(message);}return {message,logMessage}},be…

uniapp学习(003-1 vue3学习 Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第11p-第p14的内容 文章目录 vue3使用介绍插值表达式例子时间戳随机数输出函数的值 ref响应式数据变量v-bind 绑…

第九章 Redis的java客户端

1. jedis 以Redis命令作为方法名称&#xff0c;学习成本低&#xff0c;简单实用。但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使用。 2. lettuce Lettuce是基于Netty实现的&#xff0c;支持同步、异步和响应式编程方式&#xff0c;并且是线程安全…

常用设计模式之单例模式、策略模式、工厂模式

单例模式 单例模式属于创建型模式 饿汉模式&#xff1a;立即加载 public class Singleton { private static Singleton instance new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } } 懒汉模式&#xff0c;懒加…

【C++打怪之路Lv7】-- 模板初阶

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

用队列实现栈,用栈实现队列

用队列实现栈 思路&#xff1a;我们利用两个队列来实现栈 1. 第一次入数据&#xff0c;两队列都为空&#xff0c;我们入第一个队列qu1 if(empty()){ qu1.offer(x); } 2. 找空队列入第二个数据 if(qu1.isEmpty()){ qu1.offer(x);}else{ qu2.offer(x);} 3. 将不入数据的队列中的元…