补题链接:Here

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。

输入格式:

输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。

输出格式:

首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。

输入样例:

9
2 6 5 5 -1 5 6 4 7

输出样例:

4
1 9

这道题只需要简单的 BFS 搜索一下就可以了

AC 代码

#include <bits/stdc++.h>
using namespace std;
#define Max 100005
vector<int> vec[Max]; //// 用来存图的
set<int> m; // 保存结点的
int fa = 1; // 记录最大字辈的下标
int bfs() {
queue<int> q;
int daishu = 0; // 记录代数,题目第一个数据让我们输出有多少代人
q.push(fa); // 之前记录的最大辈分,把它压到队列,进行bfs
q.push(-1); // 这个 -1 ,相当是一个标记变量, 说明这一层结束了,
int flog = 0; // 看它有没有孩子的标记变量
while (!q.empty()) {
int t = q.front(); if (t == -1) { /// -1 ,说明遍历完这一代人了,
daishu++; // 代数++
if (flog == 1) // 有孩子, flog == 1 ,清空set
m.clear();
flog = 0; //
q.pop();
q.push(
-1); // 这一代人的孩子都压到队列了,说明下一代人都遍历完了,压
// -1 到队列中
t = q.front();
} q.pop();
if (t == -1)
continue;
// cout<<t<<" ";
for (int i = 0; i < vec[t].size(); i++) {
q.push(vec[t][i]); // 把 t 的孩子都压到队列中
flog = 1; // 这一代人,有孩子, flog == 1
}
m.insert(t); //
}
return daishu;
// cout<<" daishu = "<<daishu<<endl;
}
int main() {
int a;
cin >> a;
for (int i = 1; i <= a; i++) {
int temp;
cin >> temp;
if (temp == -1) {
if (a == 1) {
cout << "1" << endl;
cout << i << endl;
return 0;
}
fa = i; // 当前字辈是最大字辈,记录下来
continue;
}
vec[temp].push_back(
i); // 当前 i 是 temp的一个孩子,那么就是temp有一个孩子,指向i
}
cout << bfs() << endl;
set<int>::iterator it;
for (it = m.begin(); it != m.end(); it++) {
if (it == m.begin())
cout << *it;
else
cout << " " << *it;
}
// cout<<"A"<<endl; return 0;
}

L2-026 小字辈 (25 point(s)) (BFS)的更多相关文章

  1. PAT 甲级 1021 Deepest Root (25 分)(bfs求树高,又可能存在part数part>2的情况)

    1021 Deepest Root (25 分)   A graph which is connected and acyclic can be considered a tree. The heig ...

  2. PAT Advanced 1106 Lowest Price in Supply Chain (25) [DFS,BFS,树的遍历]

    题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)– everyone in ...

  3. PAT Advanced 1079 Total Sales of Supply Chain (25) [DFS,BFS,树的遍历]

    题目 A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)– everyone in ...

  4. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  5. 51nod 1444 破坏道路(bfs+枚举)

    1444 破坏道路 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在某一个国家,那儿有n个城市,他们通过m条双向 ...

  6. ZOJ 1091 Knight Moves(BFS)

    Knight Moves A friend of you is doing research on the Traveling Knight Problem (TKP) where you are t ...

  7. Python_sklearn机器学习库学习笔记(三)logistic regression(逻辑回归)

    # 逻辑回归 ## 逻辑回归处理二元分类 %matplotlib inline import matplotlib.pyplot as plt #显示中文 from matplotlib.font_m ...

  8. sklearn基础知识-准备阶段

    6.标签特征二元化 处理分类变量还有另一种方法,不需要通过OneHotEncoder,我们可以用LabelBinarizer. 这是一个阈值与分类变量组合的方法. In [1]: from sklea ...

  9. 自学Python2.2-基本数据类型-列表list(object)

    Python List方法总结 一. 列表简介: 列表是序列对象,可包含任意的Python数据信息,如字符串.数字.列表.元组等   列表的数据是可变的,我们可通过对象方法对列表中的数据进行增加.修改 ...

  10. python的函数式编程

    map #对参数迭代器中的每个元素进行操作,返回一个新的迭代器 map(func, *iterables) --> map object Make an iterator that comput ...

随机推荐

  1. Opencv学习笔记(1)

    1.安装环境 如何安装Python解释器和PyCharm,这里就不说明了, 参考文章链接:https://blog.csdn.net/weixin_72959097/article/details/1 ...

  2. 系统监控:使用日志文件 journalctl的使用

    journalctl 显示最近登录的: 上面有最近登录的时间,和系统操作 几十年来,Linux日志记录一直由syslogd守护进程管理.Syslogd将收集系统处理和应用程序发送到/dev/log伪设 ...

  3. [cnn]cnn训练MINST数据集demo

    [cnn]cnn训练MINST数据集demo tips: 在文件路径进入conda 输入 jupyter nbconvert --to markdown test.ipynb 将ipynb文件转化成m ...

  4. [ABC317G] Rearranging

    Problem Statement There is a grid with $N$ rows and $M$ columns. The square at the $i$-th row from t ...

  5. 【matlab混沌理论】1.1.混沌理论简介

    混沌理论 1.简介          混沌理论是一个跨学科的科学研究领域和数学分支,专注于对初始条件高度敏感的动力系统的基本模式和确定性定律,曾被认为具有完全随机的无序和不规则状态.混沌理论指出,在混 ...

  6. 一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults

    本文基于内核 5.4 版本源码讨论 在前面两篇介绍 mmap 的文章中,笔者分别从原理角度以及源码实现角度带着大家深入到内核世界深度揭秘了 mmap 内存映射的本质.从整个 mmap 映射的过程可以看 ...

  7. 学习JVM---入门

    1.JVM体系结构 JVM的位置 JVM体系结构 2.类加载器 双亲委派机制 package java.lang; /** * 测试自定义java.lang.String类能否运行成功 * 体会双亲委 ...

  8. Havoc C2d的初次使用

    Havoc C2 简介 Havoc是一款现代化的.可扩展的后渗透命令控制框架 当前的Havoc版本还处于早期开发版,随着框架的不断成熟,可能会对Havoc的API和核心结构进行大量更改 以下的配置部分 ...

  9. uni-app+vue3+ts项目搭建完整流程

    项目代码同步更新至码云 uni-vue3-ts-template 开发前准备 利用 uni-app 开发,有两种方法: 通过 HBuilderX 创建(需安装 HBuilderX 编辑器) 通过命令行 ...

  10. Javac多模块化编译

    转载:原文链接 从SDK9开始,Java支持多模块编译.那么,怎么用javac实现多模块编译呢? 项目介绍 先来看看我们的项目. 首先lib文件夹下是依赖模块,有一个hello模块.hello模块包含 ...