标签:
题目大意:第一行给出测试用例数T,第二行给出一个整数N,表示树中的节点个数,然后接下来N-1行每行输入两个整数,第一个整数是第二个整数的父母节点,最后给出两个的整数表示两个节点,求这两个节点的最近的共同祖先。比如题目图中2和3的最近共同祖先是节点10,节点4和12的最近共同祖先节点是4.
思路:用多重链表存储树,用一个数组记录每个节点的父母节点,用一个数组记录每个节点的深度
1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 using std::vector; 5 vector<int> tree[10010]; 6 int root[10010]; 7 int depth[10010]; 8 9 void dfs(int i,int dep) 10 { 11 for(vector<int>::iterator it = tree[i].begin(); it != tree[i].end(); ++it) 12 dfs(*it ,dep+1); 13 depth[i] = dep; 14 } 15 16 int main() 17 { 18 int t,n,a,b; 19 scanf("%d",&t); 20 while(t--) 21 { 22 memset(depth,0,sizeof(depth)); 23 memset(root,-1,sizeof(root)); 24 scanf("%d",&n); 25 for(int i = 1; i < n; ++i) 26 tree[i].clear(); 27 for(int i = 1; i < n; ++i) 28 { 29 scanf("%d %d",&a,&b); 30 tree[a].push_back(b); 31 root[b] = a; 32 } 33 34 int i; 35 for(i = 1; root[i] >= 0; ++i); 36 37 dfs(i,0); 38 scanf("%d %d",&a,&b); 39 while(a != b) 40 { 41 //节点a更深,然后就网上找a的父母节点 42 if(depth[a] > depth[b]) a = root[a]; 43 //同上,直到找到最近共同祖先停止循环 44 else b = root[b]; 45 } 46 printf("%d\n",a); 47 } 48 return 0; 49 }
poj 1330 Nearest Common Ancestors
标签:
原文地址:http://www.cnblogs.com/guoyongheng/p/5780081.html