最近想做最短路的题,就学了学Dijkstra算法,注释写的很详细。
代码
#include <stdio.h>
#define Max 0x3fffffff
int map[1005][1005]; // 记录每两个点之间的距离
int dis[1005];
void dijkstra(int n, int start) // 主算法
{
int visit[1005] = {0};
// k是未选择点中到起点距离最小的点,min是该点到起点的距离
int min, i, j, k;
visit[start] = 1; // 起点标记
for (int i = 0; i < n; i++) // 一个个点来
{
min = Max; // 每次循环都要把min归为最大
for (int j = 0; j <= n; j++)
{
if (visit[j] == 0 && dis[j] < min)
{
min = dis[j];
k = j;
}
}
// 选择k点
visit[k] = 1;
// 更新剩余点的距离
for (int j = 1; j <= n; j++)
{
if (visit[j] == 0 && dis[j] > dis[k] + map[k][j])
dis[j] = dis[k] + map[k][j];
}
}
printf("%d\n", dis[n]);
}
// 邻接矩阵输入,起点到每个点距离初始化
int main()
{
// m是边数量,n是点数量, start是起点
int m, n, from, to, cost, start;
while (scanf("%d %d", &m, &n) != EOF)
{
for (int i = 1; i <= n; i++) // 输入
{
map[i][i] = 0; // 自己到自己的距离为0
for (int j = 1; j < i; ++j) // 其余各点的距离先标记为无穷大
map[i][j] = map[j][i] = Max; // 双向都要标记
}
for (int i = 1; i <= m; i++) // 输入
{
scanf("%d %d %d", &from, &to, &cost);
/*
若之前已经存过该两点的距离了,那就比较这次的和上次的哪次更短,存距离更短的那次
if (map[from][to] > cost)
*/
map[from][to] = map[to][from] = cost;
}
scanf("%d", &start);
for (int i = 1; i <= n; i++) // 存从起点到每个点的距离,最后要求的就是起点到终点的距离,不邻接的点距离是MAX
dis[i] = map[start][i];
dijkstra(n, start);
}
return 0;
}