• PAT 1004 Counting Leaves (C++)


    A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.

    Input Specification:

    Each input file contains one test case. Each case starts with a line containing 0

    ID K ID[1] ID[2] ... ID[K]
    

    where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID's of its children. For the sake of simplicity, let us fix the root ID to be 01.

    The input ends with N being 0. That case must NOT be processed.

    Output Specification:

    For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.

    The sample case represents a tree with only 2 nodes, where 01 is the root and 02 is its only child. Hence on the root 01 level, there is 0 leaf node; and on the next level, there is 1 leaf node. Then we should output 0 1 in a line.

    Sample Input:

    1. 2 1
    2. 01 1 02

    Sample Output:

    0 1

    题意:给出n个点个m个有孩子的节点,问每一层无孩节点的个数

    测试点2是节点就只有根节点(n=1,m=0),输出1

    解析:我们先读入每个有孩子的节点,然后开一个sd[ i ]数组来记录第 i 节点在哪一层,因为根节点在第1层,因此我们可以遍历所有点,他们的孩子的深度就是父节点深度+1,然后利用广搜来进行答案记录

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=105;
    6. vector<int> v[N];
    7. int g[N],n,m,sd[N];//g记录每个深度无孩节点的个数,sd[i]记录第i节点所在的层数
    8. void solve()
    9. {
    10. queue<int> q;
    11. q.push(1);
    12. while(q.size())
    13. {
    14. int u=q.front();
    15. q.pop();
    16. for(int i=0;isize();i++)
    17. {
    18. int j=v[u][i];
    19. if(v[j].size()==0) g[sd[j]]++;//对应节点没有孩子,对应深度满足条件节点个数+1
    20. else q.push(j);
    21. }
    22. }
    23. }
    24. int main()
    25. {
    26. scanf("%d%d",&n,&m);
    27. sd[1]=1;//根节点在深度1
    28. int maxn=0;//记录最大深度,为后输出
    29. while(m--)
    30. {
    31. int fa,k,p;
    32. scanf("%d%d",&fa,&k);
    33. while(k--)
    34. {
    35. scanf("%d",&p);
    36. v[fa].push_back(p);//父节点存储儿子
    37. }
    38. }
    39. for(int i=1;i<=n;i++)
    40. {
    41. for(int j=0;jsize();j++)
    42. {
    43. sd[v[i][j]]=sd[i]+1;//儿子深度=父亲深度+1
    44. maxn=max(maxn,sd[i]+1);//更新最大深度
    45. }
    46. }
    47. solve();
    48. for(int i=1;i<=maxn;i++)
    49. {
    50. if(i!=1) printf(" ");
    51. printf("%d",g[i]);
    52. }
    53. if(maxn==0) printf("1");//特判,节点就只有根节点,输出1
    54. printf("\n");
    55. return 0;
    56. }

  • 相关阅读:
    Mysql 事物与存储引擎
    什么是语法糖?Java中有哪些语法糖?
    Gang Scheduling Performance Benefits for Fine-Grain Synchronization
    深度解密Go底层Map
    ES6的数组、对象拷贝
    医疗产品方案|智能蓝牙血压计方案
    linux驱动文件私有数据(字符设备基础二)
    泛微连锁商超采购管理方案:全组织统一、高效合规、业务协同
    华纳云:Linux每天自动备份mysql数据库怎么实现
    python从入门到出家(二)变量和注释
  • 原文地址:https://blog.csdn.net/qq_63739337/article/details/127657128