PTA 小字辈(树)

题目

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

输入格式:

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

输出格式:

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

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

题解

#include <iostream>
#include <vector>
#include <set>
using namespace std;

int n;
int root;
int maxlevel = 1;
vector<vector<int>> list;
set<int> s;

void dfs(int node, int level) {
    if (level > maxlevel) {
        maxlevel = level;
        s.clear();
        s.insert(node);
    } else if (level == maxlevel) {
        s.insert(node);
    }

    for (int i = 0; i < list[node].size(); i++) {
        dfs(list[node][i], level + 1);
    }
}

int main() {
    cin >> n;
    list.resize(n + 1);

    for (int i = 1; i <= n; i++) {
        int temp;
        cin >> temp;
        if (temp != -1)
            list[temp].push_back(i);
        else
            root = i;
    }

    dfs(root, 1);

    cout << maxlevel << endl;
    int len = s.size();
    int j = 1;
    for (int i : s) {
        if (j == len) {
            cout << i << endl;
        } else {
            cout << i << " ";
        }
        j++;
    }

    return 0;
}

import java.util.*;

public class youngster {
    static int n;
    static int root;
    static int max=1;
    static List<List<Integer>> list=new ArrayList<>();
    static Set<Integer> set=new HashSet<>();
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        for(int i=0;i<=n;i++){
            list.add(new ArrayList<Integer>());
        }
        for(int i=1;i<=n;i++){
            int temp=scanner.nextInt();
            if(temp!=-1)
                list.get(temp).add(i);
            else
                root=i;
        }

        dfs(root,1);

        System.out.println(max);
        int len=set.size();
        int j=1;
        for(Integer i:set){
            if(j==len){
                System.out.println(i);
            }else
                System.out.print(i+" ");

            j++;
        }

    }

    public static void dfs(int node,int leval){
        if(leval>max){
            max=leval;
            set.clear();
            set.add(node);
        }else if(leval == max){
            set.add(node);
        }

        List<Integer> l=list.get(node);
        for(int i=0;i<l.size();i++){
            dfs(l.get(i),leval+1);
        }
    }

}

思路

这道题没有什么难点,掌握树结构,然后通过深搜或者广搜记录层数搜索即可。
问题在于pta平台也太针对Java了,同样的代码,java大部分超时甚至答案错误,改成c++之后直接通过!!!!!!

附上java惨状
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值