/* Name: 最短路(dijkstra邻接矩阵) Copyright: Author: Try_86 Date: 12/04/12 18:09 Description: */ #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 105; const int MAX = 1000000000;//定义无穷大 bool vis[N]; int map[N][N], dis[N]; void init(int vs) {//初始化 for (int i=1; i<vs; ++i) { map[i][i] = 0; for (int j=i+1; j<=vs; ++j) map[i][j] = map[j][i] = MAX; } return ; } void dijkstra(int vs, int s) { memset(vis, false, sizeof(vis)); int pos = s; vis[pos] = true; for (int i=1; i<=vs; ++i) dis[i] = map[pos][i]; dis[pos] = 0; int minLen; for (int i=1; i<vs; ++i) { minLen = MAX; for (int j=1; j<=vs; ++j) { if (!vis[j] && minLen>dis[j]) minLen = dis[j], pos = j; } vis[pos] = true; for (int j=1; j<=vs; ++j) { int len = dis[pos]+map[pos][j];//松弛操作 if (!vis[j] && dis[j]>len) dis[j] = len; } } return ; } int main() { int n, m; while (scanf("%d%d", &n, &m), n+m) { init(n); int u, v, w; for (int i=0; i<m; ++i) { scanf ("%d%d%d", &u, &v, &w); if (map[u][v] > w) map[v][u] = map[u][v] = w;//去重边,并选择最短的一条 } dijkstra(n, 1); printf ("%d\n", dis[n]); } return 0; }