poj 1125 Stockbroker Grapevine
题意:给出一个有N个点的图,求每一个点到其他各点最长距离中的最小值。
思路:读懂了题意,这题就是一个水到不能再水的题。就是一个flody,然后求出任意两点的最小距离。然后一个二重循环就行了。
代码:
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <math.h> #define N 105 #define INF 100000000 using namespace std ; int map[N][N] ; int n ; int main() { int i , j , k , x , y , t ; while ( scanf ( "%d" , &n ) , n ) { for ( i = 1 ; i <= n ; i++ ) for ( j = 1 ; j <= n ; j++ ) map[i][j] = INF ; for ( i = 1 ; i <= n ; i++ ) { scanf ( "%d" , &t ); while ( t-- ) { scanf ( "%d%d" , &x , &y ); map[i][x] = y ; } } for ( k = 1 ; k <= n ; k++ ) for ( i = 1 ; i <= n ; i++ ) for ( j = 1 ; j <= n ; j++ ) if( map[i][j] > map[i][k] + map[k][j] ) map[i][j] = map[i][k] + map[k][j] ; /*for ( i = 1 ; i <= n ; i++ ) for ( j = 1 ; j <= n ; j++ ) printf ( "%d %d = %d\n" , i , j , map[i][j] );*/ int ans = INF ; int minx , pos ; for ( i = 1 ; i <= n ; i++ ) { minx = -1 ; for ( j = 1 ; j <= n ; j++ ) if ( i != j && map[i][j] > minx ) minx = map[i][j] ; if ( minx < ans ) { ans = minx ; pos = i ; } } if ( ans == INF ) printf ( "disjoint\n" ); else printf ( "%d %d\n" , pos , ans ) ; } return 0 ; }
再次痛恨自己的英语水平,什么时候能够顺利的读下来题啊。