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,

每一个输入文件包含一个测试用例,每一个测试用例由一行开始,包含N,

the number of nodes in a tree, and M (< N), the number of non-leaf nodes.

表示数节点的数目,和一个M,表示不是叶子的节点

Then M lines follow, each in the format:

接下来M行,每一行格式是这样的:

ID K ID[1] ID[2] ... ID[K]

where ID is a two-digit number representing a given non-leaf node,

ID是一个两位数表示一个被给出的非叶子节点

K is the number of its children, followed by a sequence of two-digit ID's of its children.

K是它孩子的数量,接下来一个连续的两位数是它孩子的ID

For the sake of simplicity, let us fix the root ID to be 01.

为了让问题简单化,让我们定义跟节点ID为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.

01是根节点,02是它唯一的孩子

Hence on the root 01 level, there is 0 leaf node;

因此对于01所在的等级来说,没有叶子为0的节点。

and on the next level, there is 1 leaf node. Then we should output "0 1" in a line.

然后对于下一个等级来说,有一个叶子的节点,所以在一行中输出“0 1“

Sample Input

2 1
01 1 02

Sample Output

0 1
一开始我看到题目之后的没什么好的思路。
首先我想到的就是我们用什么去存放这棵树,结构体数组链表,肯定可以存放所有完整的关系。
但是当我建完结构体之后我就发现,其实对于这道题目的输出来说,父子的关系并没有那么重要,尤其是这个父亲有那几个孩子,这个信息基本用不到。
然后就是这个节点在这颗树的等级,其实只要知道自己的父亲是谁,自己的父亲等级是多少,那么就能知道自己的等级了。
分析完这几个点之后,下面就是要注意的地方了。
 
首先我们不能直接在输入的时候就确定等级,因为你输入的时候,虽然你知道你父亲是谁了,但是你不一定知道你父亲的等级是多少,有可能你父亲的等级还没有确定呢。所以我们只能先记录父亲。然后通过后面的循环去把所有的等级更新一遍。
这也导致了这是这道题时间复杂度最高的地方了。因为简单起见我用了结构体数组去存放,这样的存放相比树来说,更新值就比较麻烦了,需要循环每个值去更新。所以时间复杂度就一下到了N^2
如果用树存放的话一定会好很多。
 
还有可以优化的地方是,可以把最后的求每个等级最后答案的数组的循环放在这个N^2里面,这样还能再快一些。
 
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<string.h> using namespace std; int result[];
struct Node
{
int level;//当前节点所在的等级
int flag;//0没有孩子,1是有孩子
int father;//父节点
}; int main()
{
struct Node nodes[];
int n,m,i,j;
int nowNode,nowNodeNumber,childNode;
int maxLevel=;
cin>>n>>m; //初始化
for (i = ; i <= n; i++)
{
nodes[i].level = ;
nodes[i].flag = ;
nodes[i].father = ;
}
nodes[].level = ; //输入并保存关系
while (m--)
{
cin>>nowNode;
cin>>nowNodeNumber; if(nowNodeNumber != )
nodes[nowNode].flag = ; while (nowNodeNumber--)
{
cin>>childNode;
//保存自己的父亲是谁
nodes[childNode].father = nowNode;
}
} for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
//如果有一个点的父亲标识是自己,那么它就是你的儿子,那么他的等级,应该是你的等级+1
if(nodes[j].father == i)
{
nodes[j].level = nodes[i].level + ;
}
}
} //查询每一个等级有多少个没有孩子的点,记录在result数组中
for (i = ; i <= n; i++)
{
if(nodes[i].flag != && nodes[i].level > )
result[nodes[i].level]++;
//记录最大的等级,用于最后的输出
if(nodes[i].level > maxLevel)
maxLevel = nodes[i].level;
}
for (i = ; i < maxLevel; i++)
{
cout<<result[i]<<" ";
}
cout<<result[i];
return ;
}

PAT1004的更多相关文章

  1. PAT1004:Counting Leaves

    1004. Counting Leaves (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A fam ...

  2. PAT-1004 Counting Leaves

    1004 Counting Leaves (30 分) A family hierarchy is usually presented by a pedigree tree. Your job is ...

  3. pat1004. Counting Leaves (30)

    1004. Counting Leaves (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A fam ...

  4. PAT (Advanced Level) Practice 1001-1005

    PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...

随机推荐

  1. TouchSlide滚动插件BUG

    TouchSlide滚动切换效果时 nextCell设定自己的class名后无效,需要用".next"或不设置

  2. C++中的向上类型转换和向下类型转换

    在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换. 向上强制类型转换 切割:覆盖方法和子类数据丢失的现象生成切割(slice) class ...

  3. Heap Operations(模拟题)

     Heap Operations time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  4. getuid和geteuid的区别

    getuid() :  函数返回一个调用程序的真实用户ID.表明当前运行位置程序的执行者. geteuid(): 函数返回返回一个有效用户的ID.(EUID)是你最初执行程序时所用的ID,该ID是程序 ...

  5. 网络请求 get post

    1.新建一个网络请求工具类,负责整个项目中所有的Http网络请求 提示:同步请求会卡住线程,发送网络请求应该使用异步请求(这意味着类方法不能有返回值) 2.工具类的实现 YYHttpTool.h文件 ...

  6. Entity FrameWork 实体属性为decimal时默认只保存2位小数

    问题描述:当采用EF的DbContext保存decimal类型数据到数据库,默认只会保存小数点后的前2位小数,其余均置0:例如保存101.182352152322,实际存到数据库里的数据为101.18 ...

  7. 从运营商小广告到HTTPS

    相信很多人都试过这样的经历,浏览一个正常的网站时,右下突然角弹出一堆小广告,而且这些广告的内容和你浏览的网站格格不入: 前几天还有某微博用户爆料访问github时居然也有广告: 又或者,你有没有试过因 ...

  8. JSP基础语法--跳转指令 jsp:forward page

    带参数的跳转指令: <jsp:forward page="{路径|<%=表达式%>}"/> <jsp:param name="参数名称&qu ...

  9. /etc/rc.local 与 /etc/init.d Linux 开机自动运行程序

    1. /etc/rc.local 这是使用者自订开机启动程序,把需要开机自动运行的程序写在这个脚本里 --------引用---------------------- 在完成 run level 3 ...

  10. Qt之打包发布(NSIS详解)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc90101fer8.html 发布方式    Qt发布的时候,通常使用两种方式:   (1)静态编译  (2)动态编译 ...