(用树的遍历求解层次性问题8.1.1)POJ 1330 Nearest Common Ancestors(求解最近共同祖先)

来源:互联网 发布:淘宝店卖什么比较火 编辑:程序博客网 时间:2024/05/19 04:02
/* * 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]为一个vectorint 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;}

原创粉丝点击