**
航电oj:最短路
**
#题目描述
#djsta 算法容易求得
#
#知识点
djsta floyd 算法
#代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mapp[101][101];
int dis[101];
int flag[101];
int INF = 0x3f3f3f;
int n,m;
void init()
{
for(int i=0; i<=100; i++)
{
for(int j=0; j<=100; j++)
{
if(i ==j)
{
mapp[i][j] =0;
}
else
{
mapp[i][j] = INF;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)//目标编号 道路条数
{
if(n ==0 && m==0)
return 0;
init();
memset(dis,INF,sizeof(dis));
memset(flag,0,sizeof(flag));
flag[1] =1;
int a,b,c;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
mapp[a][b] = c;
mapp[b][a] = c;
}
dis[1] = 0;
for(int i=2; i<=n; i++)//从2开始
{
dis[i] = mapp[1][i];
}
int min = INF;
int count ;
for(int i=1; i<=n; i++)
{
min = INF ; ///标记序数
for(int j=1;j<=n;j++)///djsta算法 先目前找出最短的一条 再慢慢跟新
{
if(!flag[j]&&dis[j] < min)
{
min = dis[j];
count = j;
}
}
flag[count] = 1;
for(int j=1; j<=n; j++)
{
if(!flag[j] && mapp[count][j] <=INF)///没到过的点
{
if(dis[j] > dis[count] + mapp[count][j])
{
dis[j] = dis[count] + mapp[count][j];
}
}
}
}
printf("%d\n",dis[n]);
}
return 0;
}
#总结
djsta 算法 多练