题目:http://acm.hdu.edu.cn/showproblem.php?pid=2544
#include<bits/stdc++.h>
#define PI 3.1415926
#define INF 1e18
#define inf 1e9
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
using namespace std ;
typedef long long ll;
typedef unsigned long long ull;
const int _max = 105;
int M[_max][_max];
bool v[_max];
int dis[_max];
int n,m;
int s,e;
void Dijkstra(){
for(int i = 1 ; i <= n ; i++) dis[i]=M[s][i];
v[s] = false;
for(int i = 1 ; i <= n-1 ; i++){
int x = s ;
m = inf;
for(int j = 1 ; j <= n ; j++){
if(v[j] && dis[j]<m)
m = dis[x=j];
}
v[x] = false;
for(int j = 1 ; j <= n ; j++)
dis[j] = min(dis[j],dis[x]+M[x][j]);
}
}
int main(){
while(cin>>n>>m){
if(!n&&!m) break;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= n ; j++)
if(i == j) M[i][j] = 0;
else M[i][j] = inf;
for(int i = 1 ; i <= m ; i++){
int a,b,c;
cin>>a>>b>>c;
if(c<=M[a][b]){
M[a][b]=c;
M[b][a]=c;
}
}
s=1,e=n;
memset(v,true,sizeof(v));
Dijkstra();
if(dis[e]==inf) cout<<-1<<endl;
else cout<<dis[e]<<endl;
}
return 0;
}