以下是全部迪杰斯特拉算法的代码以及注释

#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分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论