#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define INF 0xfffffff
#define N 1010
int maps[N][N], dist[N];//distance保存表示从起点到i点的距离 maps保存图
bool visit[N];//标记这个店是否被参观过
int point, side;//点,边
void Init();
int Dij(int Star, int End);
int main()
{
while(cin >> point >> side, point + side)
{
Init();//Initial
int pa, pb, i, t;
for(i=0; i<side; i++)
{
cin >>pa>>pb>>t;
maps[pa][pb]=min(maps[pa][pb], t);//因为也许反向走路的长度不同
maps[pb][pa]=maps[pa][pb];
}
int answer=Dij(1, point);
cout << answer << endl;
}
return 0;
}
void Init()
{
for(int i=0; i<=point; i++)
{
visit[i]=false;
dist[i]=INF;
for(int j=0; j<=i; j++)//其实不明白这里为什么这样写,即便是我自己写的
maps[i][j]=maps[j][i]=INF;//真的很神奇,其实这就等同于for(int j=0; j<=point; j++) maps[i][j]=INF;
}
}
int Dij(int Star, int End)
{
dist[Star]=0;
for(int i=1; i<=point; i++)
{
int index, Min;
index=0, Min=INF;//index 代表与i距点最近的点的下标
for(int j=1; j<=point; j++)
{
if(!visit[j]&&Min>dist[j])
Min=dist[j], index=j;
}//代表找到了距1点最近的一个点 这是一个二维矩阵
visit[index]=true;
for(int j=1; j<=point; j++)
{
if(!visit[j]&&dist[j]>dist[index]+maps[index][j])
dist[j]=dist[index]+maps[index][j];
}
}
return dist[End];
}
连接表代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xfffffff #define maxn 1002 struct node { int e, w; }; vector<node> G[maxn]; int dist[maxn];//表示从起点到第i点的距离 bool vis[maxn];//判断这个点是否被参观过 int m, n;//边数 m 顶点数 n void Init() { memset(vis, false, sizeof(vis)); for(int i=0; i<=n; i++) { dist[i] = INF; G[i].clear(); } } int Dij(int Star,int End)//起点 --- 终点 { dist[Star] = 0; for(int i=1; i<=n; i++) { int index = 0, Min = INF; for(int j=1; j<=n; j++) { if( !vis[j] && Min > dist[j] )//找出没有被参观过,并且距离起点最近的点 Min = dist[j], index = j; } vis[index] = true; int len = G[index].size(); for(int j=0; j<len; j++)//更新所有未曾到达的点距离,使之成为最近的点 { node P; P = G[index][j]; if( !vis[P.e] && dist[P.e] > dist[index] + P.w ) { dist[P.e] = dist[index] + P.w; } } } return dist[End]; } int main() { node P; while(cin >> n >> m, m + n) { Init(); int a, b , c; for(int i=0; i<m; i++) { cin >> a >> b >> c; P.e = b, P.w = c; G[a].push_back(P); P.e = a; G[b].push_back(P); } int ans = Dij(1,n); cout << ans << endl; } return 0; }