跳转至

ABC263B Ancesto

题目分析

本题给定了一个家谱关系:共 n 个人,其中第 i 个人的上一代是 $p_i$(且满足 $p_i < i$)。
题目保证输入合法:即第 $1$ 个人没有上一代,其余每个人都指向编号比自己小的某个祖先。

目标是计算从第 n 个人追溯到第 1 个人之间相隔多少代,也可以理解为从 n 开始沿着上一代一路向上跳,直到跳到第 1 个人,问跳了多少次。


解题思路

  • 把每个人的上一代信息存进数组 p[i]
  • 从第 n 个人开始,一直向上追溯到 1
  • 每追溯一次,就表示隔了一代,计数器加一;
  • 最后输出这个计数器的值即可。

实现步骤

  • 定义数组 p[55],将输入存到下标从 2n 。存储上一代信息;
  • 定义变量 x = n 表示当前人;
  • 定义计数器 cnt = 0
  • 使用 while (x != 1) 循环:
    • 更新 x = p[x]
    • cnt++
  • 最后输出 cnt

复杂度分析

  • 时间复杂度:$O(n)$,最多从 n 向上跳到 1,跳 n 次以内;
  • 空间复杂度:$O(n)$,用于存储上一代信息的数组。

总结

  • 本题本质是从 n 一路向上走家谱链,直到走到 1,问路径长度;
  • 只需要模拟跳代过程,不涉及复杂算法;
  • 输入小,直接用数组和循环处理即可。