LCA模版题。
贴个模板以后参考用。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 10005
#define inf 1<<28
using namespace std;
int f[Max],LCA[Max];
bool visit[Max];
vector<int>g[Max],q[Max];
int n;
bool notfather[Max];
int find(int x)
{
if(f[x]==x)
return x;
else
return f[x]=find(f[x]);
}
void DFS(int u)
{
int i,j;
for(i=0; i<g[u].size(); i++)
{
DFS(g[u][i]);//回溯
f[g[u][i]]=u;
}
visit[u]=1;
for(i=0; i<q[u].size(); i++)//询问
{
if(visit[q[u][i]])
{
cout<<find(q[u][i])<<endl;//因为只有一个询问。所以找到即退出
return ;
}
}
}
void init()
{
int i,j;
for(i=0; i<=n; i++)
{
g[i].clear();
q[i].clear();
f[i]=i;
visit[i]=0;
notfather[i]=0;
}
}
int main()
{
int i,j,k,l,T;
cin>>T;
int a,b;
while(T--)
{
cin>>n;
init();
for(i=0; i<n-1; i++)
{
scanf("%d%d",&a,&b);
g[a].push_back(b);
notfather[b]=1;//寻找父节点
}
scanf("%d%d",&a,&b);
q[a].push_back(b);
q[b].push_back(a);
for(i=1; i<=n; i++)
{
if(!notfather[i])
{
DFS(i);
}
}
}
return 0;
}