Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <ctime>
  7. #include <queue>
  8. using namespace std;
  9. #define MAXN 503
  10.  
  11. typedef pair< int, int > par;
  12.  
  13. int A[ MAXN ];
  14. int B[ MAXN ];
  15.  
  16. int n;
  17.  
  18. int dist[ MAXN ][ MAXN ];
  19. par prev[ MAXN ][ MAXN ];
  20. queue< par > Q;
  21.  
  22. queue< char > recon;
  23. queue< char > ret;
  24.  
  25. vector< int > apotez[ MAXN ];
  26. vector< int > bpotez[ MAXN ];
  27.  
  28. int main(){
  29.   scanf( "%d", &n );
  30.   for( int i = 0; i < n; ++i ){
  31.     scanf( "%d%d", &A[i], &B[i] );
  32.     --A[i]; --B[i];
  33.     apotez[A[i]].push_back( i );
  34.     bpotez[B[i]].push_back( i );
  35.   }
  36.  
  37.   memset( dist, 0x3f, sizeof dist );
  38.  
  39.   dist[0][0] = 0;
  40.   Q.push( par( 0, 0 ) );
  41.  
  42.   while( !Q.empty() ){
  43.     int x = Q.front().first;
  44.     int y = Q.front().second;
  45.     Q.pop();
  46.  
  47.     for( int i = 0; i < (int) apotez[x].size(); ++i ){
  48.       for( int j = 0; j < (int) apotez[y].size(); ++j ){
  49.         if( dist[apotez[x][i]][apotez[y][j]] <= dist[x][y] ) continue;
  50.         Q.push( par( apotez[x][i], apotez[y][j] ) );
  51.         dist[apotez[x][i]][apotez[y][j]] = dist[x][y] + 1;
  52.         prev[apotez[x][i]][apotez[y][j]] = par( x, y );
  53.       }
  54.     }
  55.  
  56.     for( int i = 0; i < (int) bpotez[x].size(); ++i ){
  57.       for( int j = 0; j < (int) bpotez[y].size(); ++j ){
  58.         if( dist[bpotez[x][i]][bpotez[y][j]] <= dist[x][y] ) continue;
  59.         Q.push( par( bpotez[x][i], bpotez[y][j] ) );
  60.         dist[bpotez[x][i]][bpotez[y][j]] = dist[x][y] + 1;
  61.         prev[bpotez[x][i]][bpotez[y][j]] = par( x, y );
  62.       }
  63.     }  
  64.   }
  65.  
  66.   vector< int > sad;
  67.   for( int i = 0; i < n; ++i )
  68.     sad.push_back( i );
  69.  
  70.   while( (int) sad.size() > 1 ){  
  71.     int best = 1;
  72.     for( int i = 2; i < (int) sad.size(); ++i )
  73.       if( dist[0][sad[i]] < dist[0][best] )
  74.         best = i;
  75.  
  76.     int a = 0, b = sad[best];
  77.  
  78.     while( a != 0 || b != 0 ){
  79.       par novi = prev[a][b];
  80.       if( A[a] == novi.first ) recon.push( 'A' );
  81.       else recon.push( 'B' );
  82.       a = novi.first;
  83.       b = novi.second;
  84.     }
  85.  
  86.     while( !recon.empty() ){
  87.       for( int i = 0; i < (int) sad.size(); ++i ){
  88.         if( recon.front() == 'A' ) sad[i] = A[sad[i]];
  89.         else sad[i] = B[sad[i]];
  90.       }
  91.       ret.push( recon.front() );
  92.       recon.pop();
  93.     }
  94.  
  95.     sort( sad.begin(), sad.end() );
  96.     sad.erase( unique( sad.begin(), sad.end() ), sad.end() );
  97.   }
  98.  
  99.   for( ; !ret.empty(); ret.pop() ) putchar( ret.front() );
  100.   putchar( '\n' );
  101.   return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement