码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1330 Nearest Common Ancestors

时间:2016-08-17 15:26:30      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:第一行给出测试用例数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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!