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> # ...
随机推荐
- mysqli 取出数据库中某表的表头和内容
需求如题 取出数据库中某表的表头和内容,并显示该表的行数和列数 <?php //显示表内容的函数 function showTable($tableName){ //连接数据库 $mysqli= ...
- cursor_sharing
CURSOR_SHARING Property Description Parameter type String Syntax CURSOR_SHARING = { EXACT | FORCE } ...
- Keil的c语言编译器
我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进 ...
- POJ 1699 Best Sequence dfs
题目: http://poj.org/problem?id=1699 无意间A了..超时一次,加了一句 if(len > ans)return; 然后就A了,dfs题,没有太多好说的,代码写的效 ...
- 一个简单的makefile,一次性编译本文件夹下所有的cpp文件
代码: CXX := g++ CFLAGS := -g TARGET := xxx.exe SRCS := $(wildcard *.cpp) OBJS := $(patsubst %cpp,%o,$ ...
- Word Puzzles
poj1204:http://poj.org/problem?id=1204 题意:给你n*m的字符串矩阵,然后p个查询,每个查询会给出一个字符串,然后问你在矩阵中能否通过8个方向搜索到这个字符串,输 ...
- C#面向对象基础类与方法
C#是纯粹的面向对象编程语言,它真正体现了“一切皆为对象”的精神. 在C#中,即使是最基本的数据类型,如int,double,bool类型,都属于System.Object(Object为所有类型的基 ...
- Linux守护进程daemon
守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启 ...
- 三年所有JAVA技术文档列表
学习工作流workflow管理基础概念.pdf 深入浅出Struts2(PDF).zip 深入浅出Hibernate.pdf 敏捷软件开发:原则.模式与实践.rar 精通Oracle.10g.Pl.S ...
- delphi非IE内核浏览器控件TEmbeddedChrome下载|TEmbeddedChrome代码
下载地址: 点击下载 代码示例: 在TForm的oncreate方法中写入一些代码 procedure TForm1.FormCreate(Sender: TObject); begin Chromi ...