总体还是蓝白点的思想,和Prim最小生成树有异曲同工之妙;
AC代码:
#include<bits/stdc++.h>
using namespace std;
int dis[101];
bool flag[101];
int w[110][110];//数组开小了,再加上后面初始化时多处理了一部分,所以wa了好多次;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&n+m)
{
for(int i=0;i<=n+1;++i)dis[i]=99999999;
memset(flag,0,sizeof(flag));
for(int i=0;i<=n+1;++i)
for(int j=0;j<=n+1;++j)w[i][j]=99999999;
for(int i=0;i<=n;++i)w[i][i]=0;
dis[1]=0;
for(int i=1;i<=m;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
w[x][y]=w[y][x]=z;
}
for(int i=1;i<=n;++i)
{
int k=0;
for(int j=1;j<=n;++j)
if(!flag[j])
if(dis[j]<dis[k])k=j;
flag[k]=1;
for(int j=1;j<=n;++j)
if(!flag[j]&&dis[k]!=99999999&&w[k][j]!=99999999)
dis[j]=min(dis[j],dis[k]+w[k][j]);
}
printf("%d\n",dis[n]);
}
return 0;
}
The end;