首页 > 其他 > 详细

PAT A1004 Counting Leaves

时间:2019-05-21 23:34:55      阅读:137      评论:0      收藏:0      [点我收藏+]

本程序为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 }

提交结果:

技术分享图片

 

PAT A1004 Counting Leaves

原文:https://www.cnblogs.com/qujunhui/p/10903146.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!