作为刚接触最短路径的练习吧,懂得Dijkstra的原理,这个题就可以过了
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 110;
const int INF = 100000000;
int S[MAXN];
int dist[MAXN];
int Edge[MAXN][MAXN];
int N,M;
void Dijkstra( int v0 )
{
int i, j, k;
for(i = 1; i <= N; ++i)
{
dist[i] = Edge[v0][i];
S[i] = 0;
}
dist[v0] = 0;
S[v0] = 1;
for(i = 1; i <= N; ++i)
{
int min = INF;
int u = v0;
for(j = 1; j <= N; ++j)
{
if( !S[j] && dist[j] < min)
{
min = dist[j];
u = j;
}
}
S[u] = 1;
for(k = 1; k <= N; ++k)
if(!S[k] && Edge[u][k] < INF && dist[k] > dist[u] + Edge[u][k])
dist[k] = dist[u] + Edge[u][k];
}
}
int main()
{
int i,j;
int a,b,c;
while( cin >> N >> M )
{
if(N == 0 || M == 0)
break;
for(i = 1; i < MAXN; ++i)
for(j = 0; j < MAXN; ++j)
Edge[i][j] = INF;
for(i = 1; i <= M; ++i)
{
cin >> a>>b>>c;
if(Edge[a][b] > c)
Edge[a][b] = Edge[b][a]= c;
}
if(N == 1)
cout<<"0"<<endl;
else
{
Dijkstra( 1 );
cout<<dist[N]<<endl;
}
}
return 0;
}