(做题学英语BFS)PTA甲级第四题--1004 Counting Leaves

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(做题学英语BFS)PTA甲级第四题--1004 Counting Leaves相关的知识,希望对你有一定的参考价值。


题目


OJ平台

题目翻译

单词积累:

hierarchy #层次体系;等级制度(尤指社会或组织)
pedigree #家谱;世系;门第;起源
sake #缘故;理由;日本米酒
Hence on #从此

长难句分析:

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.
 # 这里的ID是一个两位数的数字,代表一个给定的非叶子结点,
 # K是他们的孩子的数量,
 # 紧随其后的是一个他们孩子的两位数ID的序列。

For each test case,
you are supposed to count those family members who have no child for every seniority level starting from the root.
# 对每个测试案例,你需要去计算出这些从根节点开始的资历级别(层级)没有孩子的家庭成员的数量。

题目翻译

一个家庭的层级结构经常被表现为一个家谱树。你的任务是统计这些家庭成员中谁没有孩子。
输入
每个输入文件包含一个测试实例。每个实例开始的一行包含N和M,N指树中的结点个数(0<N<100),M指非叶结点的个数。然后下面有M行,每行的格式如下:
ID K ID[1] ID[2] …ID[K]
ID是一个两位数的数字,表示一个非叶结点。K表示其孩子的数量。随后是一个序列,序列中是该结点的孩子结点的两位数ID。为了简单起见,我们把根结点的ID固定为01。
输出
对于每个测试实例,你应该计算从根结点开始的每一层中没有孩子的家庭成员的个数。数字必须在一行内输出,用空格分隔,在每行结尾不能有多余的空格。
测试样例表示了一个只有两个结点的树,01是根结点,02是它仅有的孩子。因此在根结点01层级,没有叶节点。再下一层级,有一个叶结点。然后我们应该在一行内输出“0 1”。

题目解析

剔除所有多余的啰嗦,就是输入每个结点的以及每个结点所对应的孩子结点,然后组成了一颗树,我们的目的就是按照层序的方式打印出树的每一层中没有孩子的结点。

  • 这样一说,是不是思路就有了,但现在有个问题就是这个树怎么去建呢?毕竟肯定是个多叉树。

建树方式
多叉树我们可以直接用静态数组的方式建设,首先由于每个结点都是给了编号的,所以完全可以选择数组的方式进行,我们用一个二维数组表示一颗多叉树,其中第一个维度表示这个结点的编号,第二个维度表示这个结点的孩子结点。比如 tree[i][100] ,它表示结点 i 的孩子结点的编号有哪些,这第二个维度100中如果存在这个编号的子节点就给他赋值,如果不存在,则默认为0。 其实这样的话,完全可以用布尔数组来表示,毕竟只需要表示孩子结点是否存在。

遍历方式
既然题目要求是打印每一层符合要求的结点数量,这就很简单了,直接bfs遍历不就行了!

解题源码分析

  • 以防有些过于基础的小兄弟一下看这么多代码(实际超级少了)有点懵,我还是拆分开来讲。

Input函数输入处理

void Input(){
	ios::sync_with_stdio(false);
	cin>>N>>M;
	int c = M;
	while(c--){
		char x[10];
		cin>>x;
		int root = atoi(x),k;
		cin>>k;
		while(k--){
			char t[10];
			cin>>t;
			int child = atoi(t);
			tree[root][child]++; 
		} 
	}
}

check函数检查是否为叶子结点,并负责下一层的扩散工作

bool check(int node){
	bool f = false;
	for(int i=0;i<100;i++){
		if(tree[node][i]){
			Q.push(i);
			f = true;
		}
	}
	return f;
}

print函数打印结果即可

void print(){
	int start = 1;
	Q.push(start);
	//用队列实现层序遍历 
	while(!Q.empty()){
		int cnt = 0;
		for(int i=Q.size();i>0;i--){
			int t = Q.front();Q.pop();
			if(!check(t))
				cnt++;
		}
		if(!Q.empty())
		cout<<cnt<<' ';
		else
		cout<<cnt;
	} 	 
}

整合代码提交

效率还行

#include<bits/stdc++.h>
using namespace std;
queue<int>Q;
int N,M;
int tree[100][100];
void Input(){
	ios::sync_with_stdio(false);
	cin>>N>>M;
	int c = M;
	while(c--){
		char x[10];
		cin>>x;
		int root = atoi(x),k;
		cin>>k;
		while(k--){
			char t[10];
			cin>>t;
			int child = atoi(t);
			tree[root][child]++; 
		} 
	}
}
bool check(int node){
	bool f = false;
	for(int i=0;i<100;i++){
		if(tree[node][i]){
			Q.push(i);
			f = true;
		}
	}
	return f;
}
void print(){
	int start = 1;
	Q.push(start);
	//用队列实现层序遍历 
	while(!Q.empty()){
		int cnt = 0;
		for(int i=Q.size();i>0;i--){
			int t = Q.front();Q.pop();
			if(!check(t))
				cnt++;
		}
		if(!Q.empty())
		cout<<cnt<<' ';
		else
		cout<<cnt;
	} 	 
}
int main(){
	Input();
	print();
	return 0;
} 

以上是关于(做题学英语BFS)PTA甲级第四题--1004 Counting Leaves的主要内容,如果未能解决你的问题,请参考以下文章

(刷算法学英语)PAT甲级--Acute Stroke(三维空间的bfs)

Educational Codeforces Round 79做题记录

JZOJ_7.15C组第四题 城市统计

pta甲级1010

PAT 甲级 1004 Counting Leaves

PTA甲级问题 写出这个数 第二个测试点无法通过