L2-026. 小字辈

标签: L2-026. 小字辈 天梯赛
9人阅读 评论(0) 收藏 举报
分类:

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

输入格式:

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

输出格式:

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

输入样例:
9
2 6 5 5 -1 5 6 4 7

输出样例:
4
1 9


通过邻接表建立孩子和父/母的关系(注意是单向的,由父/母指向孩子)。建立起来一个树形结构。根结点可以通过-1来找到。从根结点开始进行深度优先遍历,查找最小一辈。
在查找最小一辈的时候可以用变量记录最小一辈,用一个集合v来保存最小一辈人的编号。在递归过程中,如果发现更小的一辈,那么就将v清空,并将这个人的编号添加到v中,如果发现同样是最小一辈的人,则将该人编号添加到v中。

由于给定的关系中,只存在一对一的关系,保证的结点不会重复访问。所以不需要建立访问数组用来标记结点是否已经访问过。


#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

vector<int> descents[100001], v;
int n, a, ancestor;

int maxdp = -1;
void dfs(int root, int dep) {
    if (dep == maxdp) v.push_back(root);

    if (dep > maxdp) {
        maxdp = dep;
        v.clear();
        v.push_back(root);
    }
    for (int i = 0; i < (int)descents[root].size(); i++) {
        dfs(descents[root][i], dep+1);
    }
}
int main () {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a);
        if (a == -1) {
            ancestor = i;
            continue;
        }
        descents[a].push_back(i);
    }

    dfs(ancestor, 1);

    sort(v.begin(), v.end());

    printf("%d\n", maxdp);

    for (int i = 0; i < (int)v.size(); i++) {
        if (i != 0) printf(" ");
        printf("%d", v[i]);
    }

    return 0;
}
查看评论

PAT天梯赛 L2-026. 小字辈 【BFS】

题目链接 https://www.patest.cn/contests/gplt/L2-026 思路 用一个二维vector 来保存 每个人的子女 然后用BFS 广搜下去,当目前的状态 是...
  • Dup4plz
  • Dup4plz
  • 2018-04-04 22:57:57
  • 26

gplt 2018.3.31

首先说书感想大二才参加第一次天梯赛 有点慌 毕竟一个人三个小时打这么多题目比赛前自己就刷了L1L2 然后别人都把L3刷完了 而且似乎手速越来越慢 内心越来越没斗志 反正就是一堆不好的预兆赛前还和队友(...
  • qq_37206717
  • qq_37206717
  • 2018-04-01 15:22:57
  • 34

PAT - 天梯赛 L2-026 小字辈 (vector模拟)

L2-026. 小字辈时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。输入格式:输入在第一行给...
  • yf224
  • yf224
  • 2018-04-05 11:54:22
  • 30

L2-026. 小字辈(vector 模拟)

L2-026. 小字辈时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。输入格式:输入在第一行给...
  • qq_37225146
  • qq_37225146
  • 2018-04-10 19:21:49
  • 12

2018天梯赛_L2-026. 小字辈

传送门 思路:只需要从上往下dfs即可。存关系的话,用一个vector存下他的儿子有谁。 #include&amp;lt;bits/stdc++.h&amp;gt; using namespace...
  • yyy_3y
  • yyy_3y
  • 2018-04-08 15:44:53
  • 22

PAT 天梯赛题集 L1-046 整除光棍 大数算法(模拟)

首先看题的数据很大,不能用整型存数据。问题描述:L1-046. 整除光棍时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者翁恺这里所谓的“光棍”,并不是指...
  • qq_38996065
  • qq_38996065
  • 2018-04-02 20:51:44
  • 16

PAT-L2-026小字辈AC代码

L2-026. 小字辈时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。输入格式:输入在第一行给...
  • qq_40748639
  • qq_40748639
  • 2018-04-02 23:46:49
  • 118

PAT 天梯赛题集 L1-020 帅到没朋友

L1-020. 帅到没朋友时间限制200 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就...
  • qq_38996065
  • qq_38996065
  • 2018-04-02 20:37:45
  • 18

小字辈(递归??)

题目链接:https://www.patest.cn/contests/gplt/L2-026L2-026. 小字辈时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Stan...
  • qq_40482358
  • qq_40482358
  • 2018-04-02 23:08:05
  • 31

gplt L2-026. 小字辈(bfs)

话不多说 10钟的事 贴代码#include&amp;lt;bits/stdc++.h&amp;gt; //L2-026. 小字辈(bfs stl) using namespace std; /...
  • qq_37206717
  • qq_37206717
  • 2018-04-01 15:33:01
  • 65
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 46万+
    积分: 1万+
    排名: 1433
    `
    加油加油 努力努力 微信打赏 支付宝打赏
    博客专栏