zoukankan      html  css  js  c++  java
  • PAT A1004 Counting Leaves

    本程序为PAT A1004 Counting Leaves答案,题目链接

    主体思想:算法主要采用DFS算法,深度优先访问每一个结点,检查其是否为叶子结点。

    详细介绍:

      使用向量容器vector存储每个结点的所有孩子结点:v[ID].push_back(temp);

      使用数组num[]记录每层的叶子结点数量;

      使用深度优先搜索算法DFS,采用递归的方式,每次向深处前进时depth++,回退时depth--;访问到某个结点时,若其无孩子,num[depth]++; 遍历结束时,可以得到所有层的num[depth];

      使用maxdepth变量抓取在整个递归过程中最大的depth;

    注意:

      使用递归方式实现DFS算法,容易忘记回退时将增量减掉。

    程序代码:

     1 #include "pch.h"
     2 #include <iostream>
     3 #include <vector>
     4 using namespace std;
     5 
     6 const int MAXN = 100;
     7 int num[MAXN];//记录每行有多少个叶子
     8 int maxdepth=0;//抓最大深度
     9 vector<int>v[MAXN];//存储每个顶点的所有叶子
    10 
    11 void DFS(int depth,int index) {
    12     if (v[index].size() == 0) {
    13         num[depth]++;
    14     }
    15     for (int i = 0; i < v[index].size(); i++) {
    16         depth++; 
    17         if(depth> maxdepth)maxdepth = depth;//抓取最大深度
    18         DFS(depth,v[index][i]);
    19         depth--;//递归回退时别忘记消除增量!
    20     }
    21 }
    22 int main()
    23 {
    24     int n, m,ID, K,temp;
    25     cin >> n >> m;
    26     fill(num, num + n, 0);//num存储每层叶子数,初始化为0
    27     if (n < 1)return 0;
    28     for (int i = 0; i < m; i++) {//M行依次录入
    29         cin >> ID >> K;
    30         for (int i = 0; i < K; i++) {
    31             cin >> temp;
    32             v[ID].push_back(temp);
    33         }
    34     }
    35     DFS(0,1);
    36     for (int i = 0; i < maxdepth; ++i) {
    37         cout << num[i] << ' ';
    38     }
    39     cout << num[maxdepth];
    40 }

    提交结果:

  • 相关阅读:
    on条件与where条件的区别
    Sqlserver中如何创建链接服务器
    SQL Server 2008 R2 主从数据库同步
    网站性能优化
    检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
    text输入框中按下enter键时阻止刷新页面
    关于以DataTable形式批量写入数据的案例
    关于Excel导入的HDR=YES; IMEX=1详解
    一条结合where、group、orderby的linq语法
    Linq使用Group By经验总结
  • 原文地址:https://www.cnblogs.com/qujunhui/p/10903146.html
Copyright © 2011-2022 走看看