L2-2 小字辈(Java)

简介: L2-2 小字辈(Java)

L2-2 小字辈(Java)

分数 25

全屏浏览题目切换布局

作者 陈越

单位 浙江大学

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

输入格式:

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

输出格式:

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

输入样例:

9
2 6 5 5 -1 5 6 4 7

输出样例:

4
1 9

答案

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class FamilyTree {
    static ArrayList<Integer>[] a;
    static int[] b;
    static int[] c;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();  // 输入节点数量
        a = new ArrayList[n + 1];
        b = new int[n + 1];
        c = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            a[i] = new ArrayList<>();
        }
        int max1 = 0;
        for (int i = 1; i <= n; i++) {
            int x = scanner.nextInt();
            if (x == -1) {
                max1 = i;
            } else {
                a[x].add(i);
            }
        }
        int in, out;
        in = out = 0;
        c[in++] = max1;
        b[max1] = 1;
        int mmxx = 0;
        mmxx = Math.max(b[max1], mmxx);
        // BFS 统计辈分
        while (in > out) {
            int x = c[out];
            for (int i = 0; i < a[x].size(); i++) {
                c[in++] = a[x].get(i);
                int num = a[x].get(i);
                b[num] = b[x] + 1;
                mmxx = Math.max(b[num], mmxx);
            }
            out++;
        }
        System.out.println(mmxx);
        int flag = 0;
        for (int i = 1; i <= n; i++) {
            if (b[i] == mmxx) {
                if (flag == 0) {
                    System.out.print(i);
                    flag = 1;
                } else {
                    System.out.print(" " + i);
                }
            }
        }
        System.out.println();
        scanner.close();
    }
}
相关文章
|
缓存 负载均衡 Java
JAVA问答5
JAVA问答5
116 0
|
监控 Dubbo 安全
JAVA问答8
JAVA问答8
107 0
|
存储 Java 编译器
初识JAVA
学习Java语言入门需要了解的内容
124 0
1062 最简分数(JAVA)
一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
|
Java
Java常见的坑(二)
你猜上述程序输出的是什么? 是 ABC easy as 123 吗? 你执行了输出操作,你才发现输出的是 ABC easy as [C@6e8cf4c6 ,这么一串丑陋的数字是什么鬼? 实际上我们知道字符串与任何数值的相加都会变为字符串,上述事例也不例外, numbers输出其实实际上是调用了Object.toString()方法,让numbers转变为'[c' + '@' + 无符号的十六进制数。
60 0
|
数据安全/隐私保护 Android开发
java32-巩固练习
java32-巩固练习
112 0
java32-巩固练习
|
Java 程序员 C语言
Java是什么
ava到底是啥?它能干什么? 自己也看过不少的课程和书,大部分都是从Java的发展史开始讲,总之就是那些什么Java历史悠久,Java很优秀,Java越来越牛,用的人越来越多,什么编程语言排行榜常年第一,大致都是这些,然后再扯些其他的,接着就上起了Hello World!就这样,你Java生涯的第一个代码开始了,意思是“你好,世界!” 我还是想不通,Java是啥,能干嘛,能不能先告诉我? 可能你在刚开始学习Java的时候也有这样的疑惑,那么你会怎么做呢?你不知道啊,怎么办?问别人?不,你应该会想到百度,不是说 百度一下,你就知道吗? 好嘞,我们上百度看看去: 640?wx_fmt=
193 0
|
Java
java if..else
java if..else
138 0
java if..else
|
Java 索引 安全