BoxerTC

Untitled

Jun 22nd, 2015
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 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 all(v)  v.begin() , v.end()
  9. #define pb push_back
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define mp make_pair
  13. #define fi first
  14. #define se second
  15.  
  16. #define test() cout << "hola q hace" << endl;
  17. #define DEBUG( x ) cerr <<  #x << "=" << x << endl;
  18. #define DEBUG2( x , y ) cerr << #x << "=" << x << " " << #y << "=" << y << endl;
  19.  
  20. #define N 200000
  21.  
  22. typedef long long ll;
  23. typedef pair< int , int > pii;
  24. typedef vector< int > vi;
  25.  
  26. #define VIZ(e,x) (orig[e] == x? dest[e] : orig[e])
  27. int n,m,fin;
  28. int orig[N], dest[N], pila[N], top = 0;
  29. vi E[N];
  30. int low[N], dfsn[N], part[N], timer;
  31. int ponte[N], bicomp[N], nbicomp;
  32. vi G[ N + 5 ];
  33. int dfsbcc (int u, int p = -1){
  34.     low[u] = dfsn[u] = ++timer;
  35.     int ch = 0;
  36.     for( auto e : E[ u ] ){
  37.         int v = VIZ (e, u);
  38.         if (dfsn[v] == 0){
  39.             pila[top++] = e;
  40.             G[ u ].pb( v );
  41.             dfsbcc (v, u);
  42.             low[u] = min (low[u], low[v]);
  43.             ch++;
  44.             if (low[v] >= dfsn[u]){
  45.                 part[u] = 1;
  46.                 nbicomp++;
  47.                 do{
  48.                     fin = pila[--top];
  49.                     bicomp[fin] = nbicomp;
  50.                 }while (fin != e);
  51.             }
  52.             if (low[v] == dfsn[v]) ponte[e] = 1;
  53.         }else if (v!=p && dfsn[v] < dfsn[u]){
  54.             pila[top++] = e;
  55.             low[u] = min (low[u], dfsn[v]);
  56.         }
  57.     }
  58.     return ch;
  59. }
  60. void bcc (){
  61.     REP(i,n) part[i] = dfsn[i] = 0;
  62.     REP(i,m) ponte[i] = 0;
  63.     nbicomp = timer = 0;
  64.     REP(i,n) if (dfsn[i] == 0) part[i] = dfsbcc (i) >= 2;
  65. }
  66.  
  67. int DP[ N + 5 ];
  68. int MAXI[ N + 5 ];
  69. int dfs( int u , int p = -1 ){
  70.     DP[ u ] = 1;
  71.     for( int v : G[ u ] ) {
  72.         if( v == p ) continue;
  73.         dfs( v , u );
  74.         DP[ u ] += DP[ v ];
  75.         MAXI[ u ] = max( MAXI[ u ] , DP[ v ] );
  76.     }
  77. }
  78. int main(){
  79.     while( sc( n ) == 1 ){
  80.         sc( m );
  81.         REP( i , N ) E[ i ].clear() , G[ i ].clear();  
  82.         REP( i , m ){
  83.             int u , v;
  84.             sc( u ) , sc( v );
  85.             u -- , v --;
  86.             orig[ i ] = u;
  87.             dest[ i ] = v;
  88.             E[ u ].pb( i );
  89.             E[ v ].pb( i );
  90.         }
  91.         clr( MAXI , 0 );
  92.         bcc();
  93.         dfs( 0 , -1 );
  94.         int ans = 1 << 30 , ind = -1;
  95.         REP( i , n )
  96.             if( part[ i ] ){
  97.                 int cur = max( MAXI[ i ] , max( n - DP[ i ] , 1 ) );
  98.                 if( cur < ans ) ans = cur , ind = i;
  99.             }
  100.         if( ind == -1 ) ind = 0;
  101.         printf( "%d\n" , ind + 1 );
  102.     }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment