题目描述:
分析:
Dijkstra算法的典型应用。
源码:
#include <stdio.h>
#include <limits.h>
//三个数组分别记录路线,最短距离,以及标志是否已经被扩展
int map[101][101], dist[101], s[101];
void dijkstra(int n, int x);
int main()
{
int n, m, a, b, c;
int i, j;
while (scanf("%d%d", &n, &m) != EOF)
{
if (n==0 && m==0)
break;
//初始化数组map
for (i = 1; i <= n; i ++)
{
for (j = 1; j <= n; j ++)
{
map[i][j] = INT_MAX;
}
}
//读取所有的边
for (i = 1; i <= m; i ++)
{
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
dijkstra(n, 1);
printf("%d\n", dist[n]);
}
return 0;
}
void dijkstra(int n, int x)
{
//x表示源点,n表示终点
int mindis, u;
int i, j;
for (i = 1; i <= n; i ++)
{
dist[i] = map[x][i];
s[i] = 0;
}
//扩展源点
s[x] = 1;
for (i = 1; i < n; i ++)
{
mindis = INT_MAX;
u = -1;
//找出距离最小的点,然后扩展它
for (j = 1; j <= n; j ++)
{
if (!s[j] && dist[j] < mindis)
{
u = j;
mindis = dist[j];
}
}
s[u] = 1;
for (j = 1; j <= n; j ++)
{
if (s[j] == 0)
{
if (dist[u]+map[u][j] < dist[j] && map[u][j] < INT_MAX)
{
dist[j] = dist[u] + map[u][j];
}
}
}
}
}