zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    60     
    61     return 0;
    62 }



  • 相关阅读:
    CSS样式表
    lianxi!
    传值
    lei!
    3.10
    if else&& stwitch break
    if else 语句
    2016.3.6
    进制转换
    PHP 面向对象的三大特征
  • 原文地址:https://www.cnblogs.com/yewanting/p/10753066.html
Copyright © 2011-2022 走看看