著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。
内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。
输入首先在一行中给出正整数 N(<10?5??),是门的数量。最后 N 行,第 i 行(1≤i≤N)按以下格式描述编号为 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 }
原文:https://www.cnblogs.com/yewanting/p/10753066.html