/*
* POJ_1330.cpp
*
* Created on: 2013年11月4日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 10010;
vector<int> a[maxn];//多重链表,其中节点i的儿子链表a[i]为一个vector
int f[maxn];//双亲关系
int r[maxn];//层次关系
void dfs(int u , int dep){//从dep层的u节点出发,先根遍历计算每个节点的层次
r[u] = dep;
for(vector<int>::iterator it = a[u].begin() ; it != a[u].end() ; ++it){
dfs(*it,dep+1);
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int i;
for(i = 0 ; i < n ; ++i){
a[i].clear();
}
memset(f,255,sizeof(f));
int x,y;
for(i = 0 ; i < n-1 ; ++i){//建立父子关系
scanf("%d%d",&x,&y);
a[x-1].push_back(y-1);
f[y-1] = x-1;
}
i = 0;
while(f[i] >= 0){//寻找根节点
++i;
}
dfs(i,0);//建立层次关系
scanf("%d%d",&x,&y);
--x;
--y;
while(x!=y){//求解最近共同祖先
if(r[x] > r[y]){
x = f[x];
}else{
y = f[y];
}
}
printf("%d\n",x+1);
}
return 0;
}
(用树的遍历求解层次性问题8.1.1)POJ 1330 Nearest Common Ancestors(求解最近共同祖先)
最新推荐文章于 2018-12-22 12:01:08 发布