一道典型的lca问题,这一道用tarjan算法即可解决。
详情参照了这篇博客:
LCA问题的Tarjan算法 » NoAlGo博客 http://noalgo.info/476.html
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
#define max_n 10007
vector<int> tree[max_n];//构建树
int qa,qb;//查询
int ancestor[max_n];//暂存最近的祖先
int indeg[max_n];//入度,判断根节点
int father[max_n];//并查集
bool book[max_n];//访问标志
int n;//顶点个数
int root;//根
void input()
{
int i;
int a,b;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
tree[i].clear();
indeg[i] = 0;
father[i] = i;
book[i] = 0;
}
for(i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
tree[a].push_back(b);
indeg[b]++;
}
for(i=1;i<=n;i++)
{
if(indeg[i]==0)
{
root = i;
break;
}
}
scanf("%d%d",&qa,&qb);
}
int find(int x)
{
if(x!=father[x])
father[x] = find(father[x]);
return father[x];
}
void get_in(int a,int b)
{
int x = find(a);
int y = find(b);
if(x!=y)
father[y] = x;
}
void tarjan(int nroot)
{
int i;
for(i=0;i<tree[nroot].size();i++)
{
tarjan(tree[nroot][i]);
get_in(nroot,tree[nroot][i]);
ancestor[find(nroot)] = nroot;
}
book[nroot] = true;
if(nroot==qa)
{
if(book[qb])
{
printf("%d\n",ancestor[find(qb)]);
}
}
if(nroot==qb)
{
if(book[qa])
{
printf("%d\n",ancestor[find(qa)]);
}
}
}
int main()
{
int i;
scanf("%d",&i);
while(i--)
{
input();
tarjan(root);
}
}