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> # ...
随机推荐
- linux正确重启MySQL的方法
修改了my.cnf,需要重启MySQL服务,正确重启MYSQL方法请看下面的文章 由于是从源码包安装的Mysql,所以系统中是没有红帽常用的servcie mysqld restart这个脚本 只好手 ...
- django查询常用操作符及models和admin的写法
以Publisher.Author.Book的model为例子 #coding=utf-8 from django.db import models # Create your models here ...
- Django web 开发指南 no such table:
在学习django web开发指南时,发布新博客点击save后会有error提示:no such table balabalabala... 百度了一下说重新运行manage.py syncdb 就可 ...
- 【技术贴】关闭CMD错误提示声音
关掉后,整个世界清静多了. cmd打开后 1. 禁用“嘀嘀”声的设备来源,这是由beep驱动服务所提供,可以将beep驱动的启动类型设置为禁用,可以打开CMD窗口,运行以下命令:永久禁用错误声音 sc ...
- CAS单点登录配置[4]:客户端配置
本节介绍一下客户端如何配置,客户端配置没有服务端那么复杂... 客户端Tomcat配置 1 首先确认证书文件已经拷贝到Tomcat的目录下,我们新建两个客户端的web应用,分别命名为Client1,C ...
- SpringSecurity简单应用(二)
这里我首先对我上一篇博文的第三个实例做一下讲解,下面是applicationContext-security.xml内容如下: <?xml version="1.0" enc ...
- Java中int与Integer
一般小写字母开头的是数据类型(如int double),大写字母开头的一般是封装为类(如Double),里面有很多方法,比如实行转换Integer.parseInt(arg0),可以把其他类型的数据转 ...
- C#判断操作系统类型汇总
Windows操作系统的版本号一览 操作系统 PlatformID 主版本号 副版本号 Windows95 1 4 0 Windows98 1 4 10 WindowsMe 1 4 90 Window ...
- Rewriting History with Git Rebase
http://code.tutsplus.com/tutorials/rewriting-history-with-git-rebase--cms-23191 1. Rebasing for a Li ...
- C 语言字符串(译)
C 语言的 switch 语句非常强大.然而,它不能用字符串作为判断条件,只能用常整数.这是可以理解的,因为 C 的字符串仅仅是数组,它们并不是并不是一个整体. 在某些情况下,将 string 作为 ...