以下是全部迪杰斯特拉算法的代码以及注释
#include <stdio.h> // 引入标准输入输出库 #include <limits.h> // 引入常量定义库,提供 INT_MAX 等常量 // 函数:寻找未处理节点中最小距离的节点 int minDistance(int dist[], int sptSet[],int n) { int min = INT_MAX, min_index; // 初始化最小距离和索引 // 遍历所有节点 for (int v = 0; v < n; v++) { // 如果节点未处理且其距离小于当前最小距离 if (sptSet[v] == 0 && dist[v] < min) { min = dist[v]; // 更新最小距离 min_index = v; // 记录该节点的索引 } } return min_index; // 返回最小距离节点的索引 } // 函数:执行迪杰斯特拉算法 void dijkstra(int n, int src) { int dist[n]; // 存储每个节点到起始节点的最短路径估计值 int sptSet[n]; // 存储已处理节点的集合 int graph[n][n]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&graph[i][j]); } } // 初始化 for (int i = 0; i < n; i++) { dist[i] = INT_MAX; // 所有节点的初始距离设为无穷大 sptSet[i] = 0; // 所有节点的初始状态设为未处理 } dist[src] = 0; // 起始节点到自身的距离设为 0 // 主循环:每次找到最小距离节点并更新其邻接节点 for (int count = 0; count < n - 1; count++) { int u = minDistance(dist, sptSet,n); // 选择未处理的最小距离节点 sptSet[u] = 1; // 标记该节点为已处理 // 更新邻接节点的距离 for (int v = 0; v < n; v++) { // 如果节点未处理且存在边,且新的距离小于当前已知距离 if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; // 更新最短路径 } } } // 打印每个节点到起始节点的最短距离 for (int i = 0; i < n; i++) { if(i==src) { continue; } if(dist[i]>=9999) { dist[i]=-1; } printf("%d\n", dist[i]); } } int main() { // 定义邻接矩阵,表示图的边权重 int n,s; scanf("%d%d",&n,&s); dijkstra(n, s); // 从节点 0 开始执行迪杰斯特拉算法 return 0; // 程序结束 } //****************************************************************************************** //https://www.dotcpp.com/oj/problem1708.html原题链接 //******************************************************************************************
总体来说是找每一个点中离他最近的点并且保存
0.0分
0 人评分
兰顿蚂蚁 (C++代码)浏览:1159 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:1052 |
WU-输出正反三角形 (C++代码)浏览:1098 |
最小公倍数 (C语言代码)浏览:1104 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:331 |
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:839 |
1134题解(求分析)浏览:795 |
C语言训练-排序问题<1> (C语言代码)浏览:369 |
简单的a+b (C语言代码)浏览:497 |
简单的a+b (C语言代码)浏览:538 |