题目链接:http://poj.org/problem?id=1330
题意:输入n组,n-1组m k,代表m是k的父亲,求第n组,m,k的最近公共祖先。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
using namespace std;
const int N = 10005;
int n;
vector<int> vec[N];
int pre[N];
bool vis[N];
bool root[N];
int u,v;
int Find(int x)
{
if(pre[x] != x)
pre[x] = Find(pre[x]);
return pre[x];
}
void Union(int x,int y)
{
x = Find(x);
y = Find(y);
if(x == y) return;
pre[y] = x;
}
void LCA(int par)
{
for(int i=0; i<vec[par].size(); i++)
{
LCA(vec[par][i]);
Union(par,vec[par][i]);
}
vis[par] = true;
if(par == u && vis[v] == true)
{
printf("%d\n",Find(v));
return;
}
if(par == v && vis[u] == true)
{
printf("%d\n",Find(u));
return;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0; i<N; i++)
{
vec[i].clear();
pre[i] = i;
root[i] = true;
vis[i] = false;
}
for(int i=1; i<n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
vec[a].push_back(b);
root[b] = false;
}
scanf("%d%d",&u,&v);
for(int i=1; i<=n; i++)
{
if(root[i] == true)
{
LCA(i);
break;
}
}
}
return 0;
}