first-try-PAT(甲级)1004笔记记录(计算树叶跟着网上完成了但要记得复习呀)

first-try-PAT(甲级)1004笔记记录

1. 原题参照PAT官网
2. 生词记录
  • format: n. 格式;版式;开本; vt. 使格式化;规定…的格式; vi. 设计版式

  • two-digit number 两位数字

  • sake of simplicity 为了简单起见
    - sake n. 目的;利益;理由;日本米酒
    - simplicity n. 朴素;简易;天真;愚蠢

  • sequence n. [数][计] 序列;顺序;续发事件; vt. 按顺序排好

3. 知识点
  • vector 向量:是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

  • 题解中解释说是利用vector进行存储、利用bfs进行搜索,book[ i ] 来记录每一层叶子节点的个数。vec[220]是一个动态的为每个非叶子结点创建一个动态序列,以用来存储它的叶子节点。

  • std::ios::sync_with_stdio(false);在C++中的输入和输出有两种方式,一种是scanf和printf,另一种是cin和cout,在#include<bits/stdc++.h>这个万能头文件下,这两种方式是可以互换的。C++和C很相似,很多大佬都用C++写C,但是在后面的一种方式中cin和cout的输入和输出效率比第一种低,原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是 iostream。

  • iostream默认是与stdio关联在一起的,以使两者同步,因此消耗了iostream不少性能。C++中的std :: cin和std :: cout为了兼容C,保证在代码中同时出现std :: cin和scanf或std :: cout和printf时输出不发生混乱,所以C++用一个流缓冲区来同步C的标准流。通过std :: ios_base :: sync_with_stdio函数设置为false后可以解除这种同步,让std :: cin和std :: cout不再经过缓冲区,iostream的性能就会提高了很多倍。因此,当解除同步之后,注意不要与scanf和printf混用以免出现问题。

4. 代码record
#include<stdlib.h>
#include<string>
#include<queue>
#include<stack>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXSIZE 30

#include<vector>
using namespace std;

int N, M, K, level[220], maxlevel, node;
vector<int>vec[220];
int leaves_answer[220];
void bfs() {
	queue<int> queue1;	//创建一个空队列用于计算广度遍历
	queue1.push(1);    //把根节点放进队列
	while (!queue1.empty()) {	//如果该层深度上的结点未被访问完
		int q1, q2, q3;
		q1 = queue1.front();	//取出该层第一个数
		queue1.pop();
		maxlevel = max(level[q1], maxlevel);//随时计算最大深度
		
		/*!!!!!!!!下面那段没看懂,我滚去复习bfs!!*/
		if (vec[q1].size() == 0) { leaves_answer[level[q1]]++; }
		for (int i = 0; i < vec[q1].size(); i++)
		{
			queue1.push(vec[q1][i]);
			level[vec[q1][i]] = level[q1] + 1;
		}
	}
}


int main() {
	std::ios::sync_with_stdio(false);
	cin >> N >> M;
	for (int i = 0; i < M; i++)
	{
		cin >> node >> K;
		for (int j = 0; j < K; j++)
		{
			int tmpID;
			cin >> tmpID;
			vec[node].push_back(tmpID);
				///vec是一个双重动态表,node表示有叶子的结点,
				///在以其为名创建动态列表中,存储其下的叶子结点ID
		}
	}
	bfs();	//利用广度遍历算法,计算vec中的结点深度以及叶子。

	//逐层输出leaves_answer 中的答案
	for (int i = 0; i <= maxlevel; i++)
	{
		cout << leaves_answer[i];
		if (i != maxlevel)cout << " ";
		else cout << endl;
	}

	return 0;
}

代码学习的原文链接:https://blog.csdn.net/qq_37360631/article/details/88650203

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值