首页 > 其他分享 >小字辈(递归找根节点)

小字辈(递归找根节点)

时间:2024-01-28 20:11:27浏览次数:23  
标签:找根 cont 小字辈 递归 int 编号 countp include 辈分

7-3 小字辈 分数 25 作者 陈越 单位 浙江大学

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

输入格式:

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

输出格式:

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

输入样例:

9
2 6 5 5 -1 5 6 4 7

输出样例:

4
1 9
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB  
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stdlib.h> 
using namespace std;

const int N = 100010;
int n,m;
int p[N]; int countp[N];

int count(int i) {
    if (countp[i] == 0) {//等于0就说明没有更新过,要进行求解
        int cont;
        if (p[i] != -1) {
            cont = count(p[i]) + 1;//递归求出相应层数
        }
        else {
            cont = 1;
        }
        countp[i] = cont;//记录对应层数,再用是直接用就行
        return cont;
    }
    else {
        return countp[i];
    }
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n; int a;
    for (int i = 1; i <= n; i++) {
        cin >> a;
        p[i] = a;
    }
    int maxx = 0;
    for (int i = 1; i <= n; i++) {
        maxx = max(count(i), maxx);
    }
    cout << maxx << endl;
    int f = 0;
    for (int i = 1; i <= n; i++) {
        if (countp[i] == maxx) {
            if (f == 1) cout << " ";
            cout << i;
            f = 1;
        }
    }
    cout << endl;
    return 0;
}

 

   

标签:找根,cont,小字辈,递归,int,编号,countp,include,辈分
From: https://www.cnblogs.com/daimazhishen/p/17993240

相关文章

  • 死锁和递归锁
    死锁(1)介绍死锁是指两个或多个进程,在执行过程中,因争夺资源而造成了互相等待的一种现象。即两个或多个进程持有各自的锁并试图获取对方持有的锁,从而导致被阻塞,不能向前执行,最终形成僵局。在这种情况下,系统资源利用率极低,系统处于一种死循环状态。fromthreadingimportThrea......
  • 数据结构与算法:递归算法
    递归算法什么是递归?函数直接或间接调用自身的过程称为递归,相应的函数称为递归函数。使用递归算法,可以很容易地解决某些问题。此类问题的示例包括汉诺塔(TOH)、中序/先序/后序树遍历、图的DFS递归函数通过调用自身的副本并解决原始问题的较小子问题来解决特定问题。需要时可以生......
  • 递归搜索文件
    1publicstaticvoidmain(String[]args){2searchFile(newFile("F:/"),"logFile-data.log");3}45privatestaticvoidsearchFile(Filefile,StringfileName){6//判断file是否是目录7if(file!=......
  • 函数--递归调用
    1.怎么写出一个递归函数step1,写好公式公式是怎么得出的?一般来说通过数学上的归纳演绎、总结得出,具体看下面的例子。step2,一定要写结束条件这一步比较简单,还是得到公式比较关键。2.走楼梯Description假如有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?为......
  • 函数递归经典题目——汉诺塔,青蛙跳台阶
    函数递归(recursion)函数递归(recursion)程序调用自身的编程技巧。只需要少量程序就可以描述除解题过程所需要的多次重复运算,大大减少了代码量递归---把大事化小必要条件*2 1存在限制条件,当满足这个限制条件时,递归便不再继续 2每次递归调用之后越来越接近这个限制条件递归......
  • 数仓如何递归查询视图依赖
    本文分享自华为云社区《GaussDB(DWS)如何递归查询视图依赖》,作者:半岛里有个小铁盒。1.前言适用版本:【8.1.0(及以上)】本文通过介绍withrecursive递归查询的办法来实现查询视图的层级依赖关系2.实现简介对于postgres生态来说,视图的依赖关系没有现成的查询方法,需要对系统表pg......
  • 使用递归解决嵌套页面的状态改变
    场景一个注销页,里面有四种状态。注销说明页输入手机号码和图形验证码输入短信验证码注销处理中在每一个状态中,都需要被APP调用window.jumpOther()返回到上一个状态<template><divv-if="pageStatus.isDelete"></div><divv-if="pageStatus.isInputPhone"></div......
  • 【8.0】死锁和递归锁
    【一】死锁【1】介绍死锁是指两个或多个进程,在执行过程中,因争夺资源而造成了互相等待的一种现象。即两个或多个进程持有各自的锁并试图获取对方持有的锁,从而导致被阻塞,不能向前执行,最终形成僵局。在这种情况下,系统资源利用率极低,系统处于一种死循环状态。【2】示例f......
  • SQL构建表层次关系,递归累加数据
     构建表的上下级关系      有一个需求,表中数据没有关系,如同一个类型的,有多个出库时间。代码--构建表的上下级关系--可以对同一个产品的,有层次关系--使用ROW_NUMBER(),来构建,最上上一级为0INSERTINTOStock([no]--编号,[quantity]......
  • 遍历二叉树非递归实现
    实现1.前序遍历publicvoidpreOrderNor(TreeNoderoot){if(root==null){return;}Stack<TreeNode>stack=newStack<>();stack.push(root);while(!stack.isEmpty()){TreeNodecur......