#include <cstdio>
#include 
<cstdlib>
#include 
<vector>

using namespace std;

#define MAXN 10010

vector
<int>  Tree[MAXN], query[MAXN];
int          Set[MAXN], num[MAXN],root[MAXN], ancestor[MAXN];
bool          visite[MAXN];
int n;

void initial()
{
    
forint i= 0; i<= n; ++i )
    Tree[i].clear(), num[i]
= 1, query[i].clear();
    
    memset( root, 
falsesizeof(root) );
    memset( visite, 
falsesizeof(root) );
    memset( ancestor, 
0sizeof(ancestor) );
}

void  make_set( int u )
{
    Set[u]
= u;
}

int find( int u )
{
    
while( u!= Set[u] ) u= Set[u];
    
    
return u;
}

void union_set( int u, int v )
{
    
int a= find(u), b= find(v);
    
    
if( num[a]> num[b] ) Set[b]= a;
    
else     
    {
       Set[a]
= b;
       
if( num[a]== num[b] ) num[b]++;
    }
}

void l_c_a( int u )
{
    make_set( u );
    ancestor[u]
= u;
    
    
for( size_t i= 0; i< Tree[u].size(); ++i )
    {
        l_c_a( Tree[u][i] );
        
        union_set( u, Tree[u][i] );
        ancestor[ find(u) ]
= u;
    }
    
    visite[u]
= true;
    
    
for( size_t i= 0; i< query[u].size(); ++i )
    
if( visite[ query[u][i] ] )
    {
        printf(
"%d\n", ancestor[ find( query[u][i] ) ] );
        
return;
    }
}

int main()
{
    
int test;
    scanf(
"%d",&test);
    
    
while( test-- )
    {
        
int a, b;
        scanf(
"%d",&n);
        
        initial();
        
forint i= 0; i< n- 1++i )
        {
            scanf(
"%d%d",&a,&b);
            
            Tree[a].push_back(b);
            root[b]
= true;
        }
        
        scanf(
"%d%d",&a,&b);
        
if( a== b ) query[a].push_back(a);
        
else
        {
            query[a].push_back(b);
            query[b].push_back(a);
        }
        
        
forint i= 1; i<= n; ++i )
        
if!root[i] )
        {
            l_c_a(i);
            
break;
        }
    }
    
    
return 0;
}
posted on 2009-02-27 14:00 Darren 阅读(302) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理