BoxerTC

Untitled

Mar 3rd, 2015
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  6. #define clr( t , val ) memset( t , val , sizeof( t ) )
  7.  
  8. #define pb push_back
  9. #define all( v ) v.begin() , v.end()
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define fi first
  13. #define se second
  14. #define mp make_pair
  15.  
  16. #define N 25
  17. #define INF (1<<29)
  18.  
  19. typedef pair< int , int > pii;
  20. typedef vector< int > vi;
  21. typedef vector< pii > vpii;
  22.  
  23. vi G[ N + 5 ];
  24. int dist[ N + 5 ][ N + 5 ] , orig[ N + 5 ] , dest[ N + 5 ];
  25.  
  26. int main(){
  27.     int cases;
  28.     sc( cases );
  29.     REP( tc , cases ){
  30.         int n , m;
  31.         sc( n ) , sc( m );
  32.         REP( i , N ) G[ i ].clear();
  33.         REP( i , n ) REP( j , n ) dist[ i ][ j ] = INF;
  34.         REP( i , n ) dist[ i ][ i ] = 0;
  35.         REP( i , m ){
  36.             int u , v;
  37.             sc( u ) , sc( v );
  38.             dist[ u ][ v ] = dist[ v ][ u ] = 2;
  39.             orig[ i ] = u;
  40.             dest[ i ] = v;
  41.         }
  42.         REP( k , n ) REP( i , n ) REP( j , n ) dist[ i ][ j ] = min( dist[ i ][ j ] , dist[ i ][ k ] + dist[ k ][ j ] );
  43.         int ans = INF;
  44.         REP( i , n ){
  45.             vi vec;
  46.             REP( j , n ) vec.pb( dist[ i ][ j ] );
  47.             sort( all( vec ) );
  48.             reverse( all( vec ) );
  49.             if( SZ( vec ) >= 2 ) ans = min( ans , vec[ 0 ] + vec[ 1 ] );
  50.         }
  51.         REP( i , m ){
  52.             int u = orig[ i ] , v = dest[ i ];
  53.             vi vec;
  54.             REP( w , n )
  55.                 if( u != w && v != w ) vec.pb( min( dist[ u ][ w ] , dist[ v ][ w ] ) + 1 );
  56.             sort( all( vec ) );
  57.             reverse( all( vec ) );
  58.            
  59.             if( SZ( vec ) >= 2 ){
  60.                  ans = min( ans , vec[ 0 ] + vec[ 1 ] );
  61.             }
  62.         }
  63.         printf( "Case #%d:\n" , tc + 1 );
  64.         printf( "%d\n" , ans == INF ? 0 : (ans / 2) );
  65.         puts( "" );
  66.     }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment