题目链接:HDOJ2544
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
int mmap[105][105];
int dis[105];// 记录某个点到vis集合的最短路
int vis[105];//vis记录某个点是否已经包含在已找到最短路的集合中
int main()
{
int n,m;//n个路口;m条边
while(cin>>n>>m&&(n+m))
{
memset(vis,0,sizeof(vis));
int a,b,c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mmap[i][j]=inf;
fill(dis+1,dis+n+1,inf);
for(int i=1; i<=m; i++)
{
cin>>a>>b>>c;
mmap[a][b]=mmap[b][a]=c;
}
vis[1]=1;
for(int i=1; i<=n; i++)
dis[i]=mmap[1][i];
while(1)
{
int mmin=inf;
int nextin=0;//不存在0号路口
for(int i=1; i<=n; i++)
{
if(vis[i]==0&&dis[i]<mmin)
{
mmin=dis[i];
nextin=i;
}
}
if(nextin==0)
{
break; //没有下一个nextin点,说明所以点都找到了自己的最短路
}
vis[nextin]=1;//把nextin加入已找到最短路的点的集合
//加入nextin后,更新dis数组
for(int i=1; i<=n; i++)
{
if(dis[nextin]+mmap[nextin][i]<dis[i])
dis[i]=dis[nextin]+mmap[nextin][i];
}
}
cout<<dis[n]<<endl;
}
}