#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = 999999999;
int n, m;
int graph[105][105];
int sign[105];
int root[105];
void Dijkstra()
{
memset(sign, 0, sizeof(sign));
for(int i = 1; i <= n; i ++)
root[i] = graph[1][i];
sign[1] = 1;
while(1)
{
int minn = 1;
for(int i = 1; i <= n; i ++)
if(!sign[i] && root[i] < root[minn])
minn = i;
if(root[minn] == INF)
break;
sign[minn] = 1;
for(int i = 1; i <= n; i ++)
if(!sign[i])
root[i] = min(root[minn] + graph[minn][i], root[i]);
}
}
int main()
{
while(~scanf("%d %d", & n, & m) && n && m)
{
int a, b, c;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
graph[i][j] = INF;
for(int i = 0; i < m; i ++)
{
scanf("%d %d %d", & a, & b, & c);
graph[a][b] = c;
graph[b][a] = c;
}
Dijkstra();
printf("%d\n", root[n]);
}
return 0;
}
题意:
寻找最短的从商店到赛场的路线。输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。输入保证至少存在1条商店到赛场的路线。
题解:
最基础的最短路。