http://acm.pku.edu.cn/JudgeOnline/problem?id=1135
Код:
#include <stdio.h>
#include <string.h>
const int INF = 2100000000 ;
const int M = 505 ;
int grid[M][M], dist[M] ;
bool visited[M] ;
int main()
{
int nVerNum, nEdgeNum, cases = 0 ;
while ( scanf ( "%d %d", &nVerNum, &nEdgeNum ) && nVerNum )
{
memset ( visited, 0, sizeof(visited) ) ;
int i, j, a, b ;
for ( i = 1; i <= nVerNum; i++ )
{
dist[i] = INF ;
for ( j = 1; j <= nVerNum; j++ )
{
if ( i == j )
grid[i][j] = 0;
else
grid[i][j] = INF ;
}
}
for ( i = 1; i <= nEdgeNum; i++ )
{
scanf ( "%d %d", &a, &b ) ;
scanf ( "%d", &grid[a][b] ) ;
grid[b][a] = grid[a][b] ;
}
printf ( "System #%d\n", ++cases ) ;
if ( nVerNum == 1 )
{
printf ( "The last domino falls after 0.0 seconds, at key domino 1.\n\n" ) ;
continue ;
}
visited[1] = true ;
for ( i = 1; i <= nVerNum; i++ )
dist[i] = grid[1][i] ;
int cur = 1, nCurNum = 1, min ;
while ( true )
{
min = INF ;
for ( j = 1; j <= nVerNum; j++ )
{
if ( !visited[j] && dist[j] < min )
{
min = dist[j] ;
cur = j ;
}
}
visited[cur] = true ;
nCurNum++ ;
if ( nCurNum == nVerNum )
break ;
for ( j = 1; j <= nVerNum; j++ )
{
if ( !visited[j] && min + grid[cur][j] < dist[j] )
dist[j] = min + grid[cur][j] ;
}
}
double nSigMax = (double)min ;
double nMultMax = (double)min ;
int first = cur, second = cur ;
for ( i = 1; i <= nVerNum; i++ )
{
for ( j = i+1; j <= nVerNum; j++ )
{
if ( dist[i] < INF && dist[j] < INF && grid[i][j] < INF )
{
if ( double(dist[i]+dist[j]+grid[i][j]) / 2 > nMultMax )
{
nMultMax = double(dist[i]+dist[j]+grid[i][j]) / 2 ;
first = i ;
second = j ;
}
}
}
}
if ( first == second )
printf ( "The last domino falls after %.1f seconds, at key domino %d.\n\n", nSigMax, first ) ;
else
printf ( "The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n", nMultMax, first, second ) ;
}
return 0;
}