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();
    }
}
相关文章
|
8月前
|
JSON 数据可视化 Java
103.【Java Microbenchmark Harness】(六)
103.【Java Microbenchmark Harness】
38 0
103.【Java Microbenchmark Harness】(六)
|
9月前
|
XML Java API
Java
Java SE
121 0
|
11月前
|
Java
【Java】肥胖问题
【Java】肥胖问题
47 0
|
11月前
|
存储 算法 Java
认识java
认识java
81 0
|
分布式计算 安全 Java
A First Look At Java
A First Look At Java
93 0
A First Look At Java
1062 最简分数(JAVA)
一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
1062 最简分数(JAVA)
1096 大美数(JAVA)
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
1096 大美数(JAVA)
1105 链表合并(JAVA)
给定两个单链表 L1​=a1​→a2​→⋯→an−1​→an​ 和 L2​=b1​→b2​→⋯→bm−1​→bm​。如果 n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如 a1​→a2​→bm​→a3​→a4​→bm−1​⋯ 的结果。例如给定两个链表分别为 6→7 和 1→2→3→4→5,你应该输出 1→2→7→3→4→6→5。
1105 链表合并(JAVA)
|
Java 测试技术
1070 结绳(JAVA)
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。
1070 结绳(JAVA)