PAT 1004. Counting Leaves (30)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input
Each input file contains one test case. Each case starts with a line containing 0 < N < 100, the number of nodes in a tree, and M (< N), the number of non-leaf nodes. Then M lines follow, each in the format:
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.
Output
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
2 1
01 1 02
Sample Output
0 1 此题我首先想到的是用两次广搜,第一次bfs等到每个节点的高度,第二次bfs得到根据每个节点所在高度得到每层(对应于高度)的叶子节点数。具体见代码:
#include <iostream>
#include <list>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std; const int N=; vector<list<int> > Tree(N);
int nodeHeight[N]={-}; //height from 0
int heightLeaves[N]; void bfs_getHeight()
{
stack<int> s;
s.push();
nodeHeight[]=;
int curNode,childNode;
while(!s.empty())
{
curNode=s.top();
s.pop();
for(list<int>::iterator iter=Tree[curNode].begin();iter!=Tree[curNode].end();++iter)
{
childNode=*iter;
nodeHeight[childNode]=nodeHeight[curNode]+;
if(Tree[childNode].size()!=)
s.push(childNode);
}
}
} void bfs_getLeaves()
{
stack<int> s;
s.push();
int curNode,childNode;
size_t size;
while(!s.empty())
{
curNode=s.top();
s.pop();
for(list<int>::iterator iter=Tree[curNode].begin();iter!=Tree[curNode].end();++iter)
{
childNode=*iter;
if(==Tree[childNode].size())
++heightLeaves[nodeHeight[childNode]];
else
s.push(childNode);
}
}
} int _tmain(int argc, _TCHAR* argv[])
{
int n,m;
cin>>n>>m;
int ID,k,IDbuf;
for(int i=;i<m;++i)
{
cin>>ID>>k;
for(int j=;j<k;++j)
{
cin>>IDbuf;
Tree[ID].push_back(IDbuf);
}
}
bfs_getHeight();
bfs_getLeaves();
int maxHeight=*max_element(nodeHeight,nodeHeight+N);
for(int i=;i<maxHeight;++i)
{
cout<<heightLeaves[i]<<' ';
}
cout<<heightLeaves[maxHeight];
return ;
}
但是结果有一个3分的测试点过不了,也不知道错在哪里,实在是没招了,就用了深搜,而且正好可以在每次递归的时候传递层数,反而只需要一次dfs就可以搞定了,相对于第一种解法,第二种解法根据N-M的值为叶子节点数,在输出的时候做了优化。具体见代码:
#include <stdio.h>
#include <map>
#include <vector>
using namespace std; const int N=;
map<int,vector<int> > adjlist;
int levelLeaves[N]={}; void dfs(int node,int level)
{
if(adjlist[node].empty())
{
++levelLeaves[level];
return;
}
vector<int>::iterator iter=adjlist[node].begin();
for(;iter!=adjlist[node].end();++iter)
dfs(*iter,level+);
} int _tmain(int argc, _TCHAR* argv[])
{
freopen("1004.txt","r",stdin);
int N,M,ID,K,childID,leaves,cnt;
scanf("%d%d",&N,&M);
leaves=N-M;
while(M--)
{
scanf("%d%d",&ID,&K);
while(K--)
{
scanf("%d",&childID);
adjlist[ID].push_back(childID);
}
}
dfs(,);
printf("%d",levelLeaves[]);
cnt=levelLeaves[];
for(int i=;cnt<leaves;++i)
{
printf(" %d",levelLeaves[i]);
cnt+=levelLeaves[i];
}
printf("\n");
return ;
}
PAT 1004. Counting Leaves (30)的更多相关文章
- PAT 1004 Counting Leaves (30分)
1004 Counting Leaves (30分) A family hierarchy is usually presented by a pedigree tree. Your job is t ...
- PAT 解题报告 1004. Counting Leaves (30)
1004. Counting Leaves (30) A family hierarchy is usually presented by a pedigree tree. Your job is t ...
- 1004. Counting Leaves (30)
1004. Counting Leaves (30) A family hierarchy is usually presented by a pedigree tree. Your job is ...
- PTA 1004 Counting Leaves (30)(30 分)(dfs或者bfs)
1004 Counting Leaves (30)(30 分) A family hierarchy is usually presented by a pedigree tree. Your job ...
- 1004 Counting Leaves (30分) DFS
1004 Counting Leaves (30分) A family hierarchy is usually presented by a pedigree tree. Your job is ...
- PAT A 1004. Counting Leaves (30)【vector+dfs】
题目链接:https://www.patest.cn/contests/pat-a-practise/1004 大意:输出按层次输出每层无孩子结点的个数 思路:vector存储结点,dfs遍历 #in ...
- 【PAT Advanced Level】1004. Counting Leaves (30)
利用广度优先搜索,找出每层的叶子节点的个数. #include <iostream> #include <vector> #include <queue> #inc ...
- PAT (Advanced Level) 1004. Counting Leaves (30)
简单DFS. #include<iostream> #include<cstring> #include<cmath> #include<algorithm& ...
- PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs
统计每层的叶子节点个数建树,然后dfs即可 #include <iostream> #include <cstdio> #include <algorithm> # ...
随机推荐
- C++ 11 笔记 (二) : for循环
首先肯定的是,我不是标题党.. C++11的for循环确实有跟C++98不一样的地方,还是先上代码: , , , , }; for (int x : test_arr) { std::cout < ...
- 使用 windows 计划任务播放音乐文件
这个问题网上可以搜到很多答案,但都有一些小细节没有交代,而我平时又很少使用计划任务,所以配置中出了点问题,特此备注. 1.播放器 检查当前系统下目标文件的默认播放器是什么,并且确保可以运行. 比如首次 ...
- Java多线程初学者指南(11):使用Synchronized块同步方法
synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可 ...
- keychain 多应用共享数据
地址:http://blog.csdn.net/jerryvon/article/details/16843065 补充: 若plist跟项目不在同一级目录下,可通过XXX/xxx.plist的方式设 ...
- ember.js
http://blog.geoinker.com/2012/12/29/seven-javascript/ http://www.csdn.net/article/2013-04-15/2814893 ...
- 【简译】Windows 线程基础
翻译一篇关于windows线程的文章,原文在此.第一次翻译,如有错误请多指教 =========================================华丽的分割线============== ...
- Python之re模块
参考:http://www.cnblogs.com/PythonHome/archive/2011/11/19/2255459.html 这个模块提供了与 Perl 相似l的正则表达式匹配操作.Uni ...
- 安卓高手之路之java层Binder
很多人一提到Binder就说代理模式,人云亦云的多,能理解精髓的少. 本篇文章就从设计角度分析一下java层BInder的设计目标,以及设计思路,设计缺陷,从而驾驭它. 对于[邦德儿]的理解, 从通信 ...
- 根据指定的commit查找对应的log
find commit by hash sha in git 问题: I need to find a commit in Git by given hash SHA. For example, if ...
- check约束条件
--约束:对列的值起一个约束性的作用,规定列的值的范围 --主键.外键.非空.自增长标识列.唯一列(unique).check约束 --check 约束 --在某个表里点击右键→设计→进去找到要约束的 ...