Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #include <ctime>
- #include <queue>
- using namespace std;
- #define MAXN 503
- typedef pair< int, int > par;
- int A[ MAXN ];
- int B[ MAXN ];
- int n;
- int dist[ MAXN ][ MAXN ];
- par prev[ MAXN ][ MAXN ];
- queue< par > Q;
- queue< char > recon;
- queue< char > ret;
- vector< int > apotez[ MAXN ];
- vector< int > bpotez[ MAXN ];
- int main(){
- scanf( "%d", &n );
- for( int i = 0; i < n; ++i ){
- scanf( "%d%d", &A[i], &B[i] );
- --A[i]; --B[i];
- apotez[A[i]].push_back( i );
- bpotez[B[i]].push_back( i );
- }
- memset( dist, 0x3f, sizeof dist );
- dist[0][0] = 0;
- Q.push( par( 0, 0 ) );
- while( !Q.empty() ){
- int x = Q.front().first;
- int y = Q.front().second;
- Q.pop();
- for( int i = 0; i < (int) apotez[x].size(); ++i ){
- for( int j = 0; j < (int) apotez[y].size(); ++j ){
- if( dist[apotez[x][i]][apotez[y][j]] <= dist[x][y] ) continue;
- Q.push( par( apotez[x][i], apotez[y][j] ) );
- dist[apotez[x][i]][apotez[y][j]] = dist[x][y] + 1;
- prev[apotez[x][i]][apotez[y][j]] = par( x, y );
- }
- }
- for( int i = 0; i < (int) bpotez[x].size(); ++i ){
- for( int j = 0; j < (int) bpotez[y].size(); ++j ){
- if( dist[bpotez[x][i]][bpotez[y][j]] <= dist[x][y] ) continue;
- Q.push( par( bpotez[x][i], bpotez[y][j] ) );
- dist[bpotez[x][i]][bpotez[y][j]] = dist[x][y] + 1;
- prev[bpotez[x][i]][bpotez[y][j]] = par( x, y );
- }
- }
- }
- vector< int > sad;
- for( int i = 0; i < n; ++i )
- sad.push_back( i );
- while( (int) sad.size() > 1 ){
- int best = 1;
- for( int i = 2; i < (int) sad.size(); ++i )
- if( dist[0][sad[i]] < dist[0][best] )
- best = i;
- int a = 0, b = sad[best];
- while( a != 0 || b != 0 ){
- par novi = prev[a][b];
- if( A[a] == novi.first ) recon.push( 'A' );
- else recon.push( 'B' );
- a = novi.first;
- b = novi.second;
- }
- while( !recon.empty() ){
- for( int i = 0; i < (int) sad.size(); ++i ){
- if( recon.front() == 'A' ) sad[i] = A[sad[i]];
- else sad[i] = B[sad[i]];
- }
- ret.push( recon.front() );
- recon.pop();
- }
- sort( sad.begin(), sad.end() );
- sad.erase( unique( sad.begin(), sad.end() ), sad.end() );
- }
- for( ; !ret.empty(); ret.pop() ) putchar( ret.front() );
- putchar( '\n' );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement