Advertisement
BoxerTC

Untitled

Mar 3rd, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 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 ] , prev[ N + 5 ][ N + 5 ] , orig[ N + 5 ] , dest[ N + 5 ];
  25.  
  26. void add( int u , int v ){
  27.     G[ u ].pb( v );
  28.     G[ v ].pb( u );
  29. }
  30.  
  31. int bfs( int n , int s , int &dd ){
  32.     queue< int >Q;
  33.     vi d( n , INF );
  34.     d[ s ] = 0;
  35.     Q.push( s );
  36.     int u;
  37.    
  38.     while( !Q.empty() ){
  39.         u = Q.front();
  40.         Q.pop();
  41.         REP( i , SZ( G[ u ] ) ){
  42.             int v = G[ u ][ i ] ;
  43.             if( d[ v ] >= INF ){
  44.                 d[ v ] = d[ u ] + 1;
  45.                 Q.push( v );
  46.             }
  47.         }
  48.     }
  49.     dd = d[ u ];
  50.     return u;
  51. }
  52.  
  53. int getDiam( int n ){
  54.     int diam;
  55.     int a = bfs( n , 0 , diam );
  56.     bfs( n , a , diam );
  57.     return diam;
  58. }
  59. int main(){
  60.     int cases;
  61.     sc( cases );
  62.     REP( tc , cases ){
  63.         int n , m;
  64.         sc( n ) , sc( m );
  65.         REP( i , n ) REP( j , n ) dist[ i ][ j ] = INF , prev[ i ][ j ] = -1;
  66.         REP( i , n ) dist[ i ][ i ] = 0;
  67.         REP( i , m ){
  68.             int u , v;
  69.             sc( u ) , sc( v );
  70.             dist[ u ][ v ] = dist[ v ][ u ] = 1;
  71.             prev[ u ][ v ] = u;
  72.             prev[ v ][ u ] = v;
  73.             orig[ i ] = u;
  74.             dest[ i ] = v;
  75.         }
  76.         REP( k , n ) REP( i , n ) REP( j , n ) {
  77.             if( dist[ i ][ j ] > dist[ i ][ k ] + dist[ k ][ j ] ) {
  78.                 dist[ i ][ j ] = dist[ i ][ k ] + dist[ k ][ j ];  
  79.                 prev[ i ][ j ] = prev[ k ][ j ];
  80.             }
  81.         }
  82.         int ans = INF;
  83.         REP( i , n ){
  84.             REP( j , n ) G[ j ].clear() ;
  85.             REP( j , n ) if( j != i ){
  86.                 add( prev[ i ][ j ] , j );
  87.             }
  88.             ans = min( ans , getDiam( n ) );
  89.         }
  90.        
  91.         REP( i , m ){
  92.             REP( j , n ) G[ j ].clear() ;
  93.             int u = orig[ i ] , v = dest[ i ];
  94.             add( u , v );
  95.             REP( j , n ) {
  96.                 if( j == u ) continue;
  97.                 if( j == v ) continue;
  98.                 if( dist[ u ][ j ] < dist[ v ][ j ] ) add( prev[ u ][ j ] , j );
  99.                 else add( prev[ v ][ j ] , j );
  100.             }
  101.             ans = min( ans , getDiam( n ) );
  102.         }
  103.        
  104.         printf( "Case #%d:\n" , tc + 1 );
  105.         printf( "%d\n" , ans );
  106.         puts( "" );
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement