PTA 7-2 深入虎穴 (30 分)

著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。

内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。

输入格式:

输入首先在一行中给出正整数 N(<105​​),是门的数量。最后 N 行,第 i 行(1iN)按以下格式描述编号为 i 的那扇门背后能通向的门:

K D[1] D[2] ... D[K]

其中 K 是通道的数量,其后是每扇门的编号。

输出格式:

在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。

输入样例:

13
3 2 3 4
2 5 6
1 7
1 8
1 9
0
2 11 10
1 13
0
0
1 12
0
0

输出样例:12




解题思路:这道题就是说给你N个数,代表N个结点,第i行,每行有K个数;
让你找树深度最深的那个结点;题目注意要先找出根,其实题目没出现的数字就是根,所以我
们可以把孩子都标记起来,没有被标记的就是根;我们可以先用一个vector把孩子都放在共同的父亲上,
然后孩子的深度都比父亲多一;代码如下:
 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 using namespace std;
 5 
 6 int N;
 7 int K;
 8 int tmp;
 9 bool vis[100005];//用来标记点是否出现过,方便找出根结点; 
10 vector<int>v[100005];   //动态数组,将相同父亲的孩子放入父亲的vector中; 
11 int depth[100005];  //用来记录每个数字的深度; 
12 int root;    
13 int tp;
14 int maxnn = -1;   //用来找深度最大的; 
15 int ans = -1;    //用来记录答案; 
16 int main()
17 {
18     queue<int>q;
19     scanf("%d",&N);
20     for(int i = 1 ; i <= N ;i++)
21     {
22         scanf("%d",&K);
23         while(K--)
24         {
25             scanf("%d",&tmp);
26             v[i].push_back(tmp);  //将孩子结点放入父亲的数组中; 
27             vis[tmp] = 1;    //标记该点是孩子结点; 
28         }
29     }
30         
31         for(int j = 1 ; j <= N ;j++)
32         {
33             if(vis[j]!=1)
34             {
35                 root = j ;    //找到根结点; 
36             }
37         }
38         q.push(root);    //将根结点入队; 
39         depth[root] = 1;  //根的深度为1; 
40         while(!q.empty())
41         {
42             tp = q.front();
43             q.pop();
44             for(int j = 0 ; j < v[tp].size();j++)
45             {
46                 depth[v[tp][j]] = depth[tp]+1;  //每个孩子的深度比父亲多一; 
47                 q.push(v[tp][j]);  //将孩子入队,重复过程;
48             }
49         }
50     
51         for(int j = 1 ; j <= N ;j++)
52         {
53             if(depth[j]>maxnn)    
54             {
55                 maxnn = depth[j];  //找最大深度的; 
56                 ans = j;     //找到答案; 
57             }
58         }
59         printf("%d\n",ans);
60     
61     return 0;
62 }



猜你喜欢

转载自www.cnblogs.com/yewanting/p/10753066.html