Dijkstra算法(C/C++简明注释详解版: 代码实现 测试数据)

news/2024/9/23 6:29:16/

算法思想简述(From C知道):

Dijkstra算法是一种求解最短路径的贪心算法,它能够找到两点之间的最短路径。C语言实现Dijkstra算法需要以下步骤:

1. 创建一个数组用于记录起始点到其他节点的距离,初始化为无穷大。
2. 创建一个数组用于记录节点是否已经被访问过,初始化为false。
3. 将起始点到自身的距离设为0。
4. 遍历图中所有节点,对于每个节点:
   1) 找到起始点到该节点距离最短的节点(即未被访问过且距离最小的节点)。
   2) 标记该节点已经被访问过。
   3) 遍历该节点的所有邻居节点,更新起始点到邻居节点的距离。
5. 最终得到起始点到其他所有节点的最短距离。

dijkstra函数代码实现:

int n, m, s, e; // 节点数, 有向线段数, 起点, 终点
int graph[size][size]; // 图的邻接矩阵
int dist[size]; // 起点到各点的最短距离
bool visited[size]; // 记录节点是否被访问过void dijkstra(int s)
{for(int i=1; i<=n; i++) // 初始化距离和访问状态{dist[i] = max;visited[i] = false;}dist[s] = 0; // 起点到自身的距离为0for(int i=1; i<=n; i++) // 遍历所有节点{int min = max, u = -1;for(int j=1; j<=n; j++) // 找到未访问节点中距离起点最近的节点{if(dist[j] < min && !visited[j]){u = j; min = dist[j];//可以用i=1的情况来理解,找到离原点最近的一个节点}}if(u == -1) return; // 若未找到可达节点,退出循环visited[u] = true; // 标记节点u为已访问for(int v=1; v<=n; v++) // 更新起点到各节点的距离{//从原点先到u再到v的路径 < 原先记录的从原点到v的路径	//u,v之间有通路if(dist[v] > dist[u] + graph[u][v] && !visited[v] && graph[u][v] != max) {										//v尚未访问过dist[v] = dist[u] + graph[u][v];}}}
}

整体程序代码实现

#include<bits/stdc++.h> 
using namespace std; 
#define size 1000 // 定义图的最大节点数
#define max 1000000000 // 定义最大值
int n, m, s, e; // 节点数, 有向线段数, 起点, 终点
int graph[size][size]; // 图的邻接矩阵
int dist[size]; // 起点到各点的最短距离
bool visited[size]; // 记录节点是否被访问过void dijkstra(int s)
{for(int i=1; i<=n; i++) // 初始化距离和访问状态{dist[i] = max;visited[i] = false;}dist[s] = 0; // 起点到自身的距离为0for(int i=1; i<=n; i++) // 遍历所有节点{int min = max, u = -1;for(int j=1; j<=n; j++) // 找到未访问节点中距离起点最近的节点{if(dist[j] < min && !visited[j]){u = j; min = dist[j];//可以用i=1的情况来理解,找到离原点最近的一个节点}}if(u == -1) return; // 若未找到可达节点,退出循环visited[u] = true; // 标记节点u为已访问for(int v=1; v<=n; v++) // 更新起点到各节点的距离{//从原点先到u再到v的路径 < 原先记录的从原点到v的路径	//u,v之间有通路if(dist[v] > dist[u] + graph[u][v] && !visited[v] && graph[u][v] != max) {										//v尚未访问过dist[v] = dist[u] + graph[u][v];}}}
}int main()
{cout<<"依次输入节点数, 有向线段数, 起点, 终点(数字间以空分隔): ";cin>>n>>m>>s>>e; // 输入节点数, 有向线段数, 起点, 终点for(int i=1; i<=n; i++) // 初始化图的邻接矩阵{for(int j=0; j<=n; j++){graph[i][j] = i==j ? 0: max;} }int u, v, wt;for(int i=1; i<=m; i++) // 输入有向线段的起点、终点和权重{cin>>u>>v>>wt;graph[u][v] = wt;graph[v][u] = wt; // 无向图,对称设置权重}dijkstra(s); // 调用Dijkstra算法求最短路径cout<<"min_track_length: "<<dist[e]; // 输出起点到终点的最短距离return 0;
}

送上测试数据一份:

/*
测试数据:
5 6 1 5
1 2 4
2 5 10
1 3 5
3 2 1
3 4 2
4 5 6
*/

~~ 希望对你有帮助 ~~


http://www.ppmy.cn/news/1458805.html

相关文章

2024面试自动化测试面试题【含答案】

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

GORM数据库连接池对接Prometheus

一、背景与介绍 Golang的database/sql包定了关于操作数据库的相关接口&#xff0c;但是没有去做对应数据库的实现。这些实现是预留给开发者或者对应厂商进行实现的。 其中让我比较关注的是Golang的sql包有没有实现连接池pool的机制呢? 毕竟Golang是静态语言&#xff0c;类似J…

多线程学习Day07

共享模型之不可变 从一个日期转换的问题开始 Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int i 0; i < 10; i) {new Thread(() -> {…

Leetcode—1396. 设计地铁系统【中等】

2024每日刷题&#xff08;127&#xff09; Leetcode—1396. 设计地铁系统 实现代码 class UndergroundSystem { public:typedef struct Checkin {string startStation;int time;} Checkin;typedef struct Checkout{int tripNum;int totalTime;} Checkout;UndergroundSystem()…

新火种AI|AI让大家都变“土”了!

作者&#xff1a;一号 编辑&#xff1a;美美 AI不仅要把人变“土”&#xff0c;还要把人变多样。 这个世界&#xff0c;终究是变“土”了。 今年五一假期&#xff0c;一个名为“Remini”的AI修图APP火遍了全网。注意&#xff0c;是Remini&#xff0c;而不是Redmi&#xff0…

【GoLang基础】切片和数组有什么区别?

问题引出&#xff1a; Go语言中的切片和数组有什么区别&#xff1f; 解答&#xff1a; 在 Go 语言中&#xff0c;切片&#xff08;slice&#xff09;和数组&#xff08;array&#xff09;是两种不同的数据类型&#xff0c;它们在使用和特性上有着明显的区别。 数组&#xff0…

Windows平台通过MobaXterm远程登录安装在VMware上的Linux系统(CentOS)

MobaXterm是一个功能强大的远程计算工具&#xff0c;它提供了一个综合的远程终端和图形化的X11服务器。MobaXterm旨在简化远程计算任务&#xff0c;提供了许多有用的功能&#xff0c;使远程访问和管理远程服务器变得更加方便&#xff0c;它提供了一个强大的终端模拟器&#xff…