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;
}