直接用Dijkstra,大水题。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
bool vis[105];
int map[105][105];
int sta, end;
const int INF = 10000000;
int nodenum, edgenum;
int dis[105];
int Dijkstra( )
{
memset(vis, false, sizeof(vis));
vis[sta] = 1;
for(int i = 1; i <= nodenum; i++)
dis[i] = ( i == 1 ? 0 : map[1][i] );
for(int i = 1; i <= nodenum; i++)
{
int temp = INF;
int k;
for(int j = 1; j <= nodenum; j++)
{
if(!vis[j] && dis[j] < temp)
{
k = j;
temp = dis[j];
}
}
vis[k] = true;
for(int j = 1; j <= nodenum; j++)
{
if(!vis[j] && dis[j] > dis[k] + map[k][j])
dis[j] = dis[k] + map[k][j];
}
}
return dis[end];
}
int main()
{
while( scanf( "%d%d", &nodenum, &edgenum ) && ( nodenum + edgenum ) )
{
end = nodenum;
sta = 1;
for( int i = 1; i <= nodenum; i++ )
for( int j = 1; j <= nodenum; j++ )
map[i][j] = map[j][i] = INF;
for( int i = 1; i <= edgenum; i++ )
{
int a,b,c;
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
int ans = Dijkstra( );
printf("%d\n",ans);
}
return 0;
}