迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。(百度百科)
这里我说一下我对于这个算法的理解, 就是求一个点到其他点的最短路径。
我们需要一个二维数组储存图的信息, 开始所有边的权值都设为正无穷, 也就是一个给定数据达不到的正数
还需要两个一维数组, 一个存储目标点到当前点的最小值, 一个储存当前点是否已经求出最短路
然后就是每次找到一个最短路, 然后就从当前点用循环更新每一个没有求出最短路点的最短路数组的值、
#include <stdio.h>
#define INF 65535
int map[50][50];
int path[50];
int visited[50];
int main(){
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
map[i][j] = INF;
for (int i = 0; i < m; i++){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
map[a][b] = c;
}
for (int i = 0; i < n; i++){
path[i] = map[0][i];
}
visited[0] = 1;
for (int i = 1; i < n; i++){
int min = 65535, k;
for (int j = 1; j < n; j++)
if (path[i] < min && !visited[i]){
min = path[i];
k = i;
}
visited[k] = 1;
printf("0到%d最短路径为%d\n", k, min);
for (int j = 1; j < n; j++){
if (!visited[j] && map[k][j] + min < path[j]){
path[j] = map[k][j] + min;
}
}
}
return 0;
}