#P16817. [NWRRC 2023资格赛]二叉树

[NWRRC 2023资格赛]二叉树

题目描述

Vadim 在路上捡到了一棵以顶点 00 为根、包含 NN 个顶点的二叉树 aa。但他最喜欢的是另一棵同样以顶点 00 为根、包含 NN 个顶点的二叉树 bb

他希望使用下列操作,将树 aa 变成一棵与树 bb 同构的树:

  • 选择一个不是根的顶点 vv
  • 将以 vv 为根的整棵子树(包含 vv 本身)从原父亲处断开;
  • 再把它挂到另一个顶点 uu 下面,其中 uu 不能位于 vv 的子树中;
  • 操作后得到的树仍必须是一棵以 00 为根的二叉树。

Vadim 确信,使用不超过 NN 次操作,一定可以把树 aa 变成一棵与树 bb 同构的树。

请输出一组满足要求的操作序列。

二叉树指每个顶点至多有两个儿子的有根树,根没有父亲。

两棵有根二叉树同构,当且仅当满足以下递归定义:

  1. 两棵树都只包含一个顶点;或者
  2. 两棵树根节点的儿子数相同,并且第一棵树的每个儿子子树都能与第二棵树的某个儿子子树一一对应且同构。

儿子的左右次序不重要。

输入格式

第一行输入一个整数 NN,表示两棵树的顶点数:

2N103.2\le N\le 10^3.

第二行输入 N1N-1 个整数 paipa_i,依次表示树 aa 中顶点 1,2,,N11,2,\ldots,N-1 的父亲:

0paiN1.0\le pa_i\le N-1.

第三行输入 N1N-1 个整数 pbipb_i,依次表示树 bb 中顶点 1,2,,N11,2,\ldots,N-1 的父亲:

0pbiN1.0\le pb_i\le N-1.

保证输入的两棵树均为二叉树。

输出格式

第一行输出一个整数 MM,表示使用的操作次数:

0MN.0\le M\le N.

接下来输出 MM 行,每行两个整数 v,uv,u,表示在当前操作中:

  • 选择以顶点 vv 为根的子树;
  • 将它重新挂到顶点 uu 下方。

必须满足:

1vN1,0uN1.1\le v\le N-1,\qquad 0\le u\le N-1.

顶点 uu 不能位于顶点 vv 的子树中,并且每次操作完成后,当前树都必须仍为二叉树。

保证答案存在。若有多种答案,输出任意一种。

样例 1

4
0 0 1
0 1 2
1
2 3

样例 2

4
2 0 0
0 3 0
0

数据范围

  • 时间限制:11 秒;
  • 空间限制:256256 MiB。

特殊判题说明

本题为构造题,合法答案不唯一,必须使用特殊判题程序检查:

  • 操作次数是否不超过 NN
  • 每次操作是否合法;
  • 中间过程是否始终保持二叉树;
  • 最终树是否与目标树同构。