模板 :
//起点:1 终点:n 求最短路径
#include<stdio.h>
#include<string.h>
#define maxn 1000000
#define N 1000
int map[N][N],dis[N],n;
bool vis[N];
void Dijkstra()
{
int i,j;
for(i=1;i<=n;i++){
dis[i]=maxn;//一开始把距离设置成无限远
vis[i]=0;
}
dis[1]=0;
for(i=1;i<=n;i++)
{
int tmp=maxn;
int k;
for(j=1;j<=n;j++)//先找到距离起始点最短的点,并将下标保存在k中
{
if(!vis[j]&&dis[j]<tmp)
tmp=dis[k=j];
}
vis[k]=1;
for(j=1;j<=n;j++)//更新 dis数组
{
if(!vis[j]&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
}
int main()
{
int i,j,m;
while(~scanf("%d%d",&n,&m)&&n+m!=0){
for(i=1;i<N;i++)
for(j=1;j<N;j++){
map[i][j]=maxn;
}
int a,b,time;
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&time);
map[a][b]=map[b][a]=time;
}
Dijkstra();
printf("%d\n",dis[n]);
}
return 0;
}
过程动画: