LCA問題,用的應該是最樸素的算法,先前序遍歷算出每個節點的深度,然後判斷x與y的深度大小關係,不斷往父節點推,直到他們相等就是LCA。
一開始在HDU OJ老師開的比賽提交是AC的,但晚上在POJ上交就WA了。。有空再看
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#define range 10010
using namespace std;
vector<int>tr[range];
int pa[range],layer[range];
void preorder(int k)
{
int p=pa[k];
layer[k]=layer[p]+1;
for(int i=0;i<tr[k].size();i++)
{
int u=tr[k][i];
preorder(u);
}
}
int find_ancestor(int a,int b)
{
if(a==b) return a;
if(layer[a]>layer[b]) find_ancestor(pa[a],b);
else find_ancestor(a,pa[b]);
}
int main()
{
// freopen("in.txt","r",stdin);
int t,n,m,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<=n;i++)
tr[i].clear();
memset(pa,-1,sizeof(pa));
memset(layer,0,sizeof(layer));
for(i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
tr[u].push_back(v);
pa[v]=u;
}
int a,b;
scanf("%d%d",&a,&b);
int tr_root;
for(i=1;i<=n;i++)
if(pa[i]==-1) {tr_root=i; break;}
layer[tr_root]=0;
preorder(tr_root);
int ans=find_ancestor(a,b);
printf("%d\n",ans);
}
return 0;
}