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