P13642 EERT
题目背景
顺着走是不可能的!这辈子都不可能!
题目描述
### 本题仅允许使用 C++ 语言提交。
小 S 有一颗有 $N$ 个节点的树,现在他邀请小 T 参观这棵树的每一个节点。
因为顺着走太无聊,所以小 S 想找到一个参观顺序,使得没有相邻两个参观的点在树上是相连的,并且每个节点恰好参观一次。
你是小 S 雇佣的导游,所以这个问题就抛给了你。
当然,如果没有解决办法,那就说明小 S 不想带小 T 参观,你也就不用管了。
**形式化的讲**,给定一颗 $N$ 个节点的树,你需要找到一条这棵树的补图的哈密顿路径。
### 实现细节
在本题中,你不需要,也不能实现 main 函数和从标准输入输出流中输入输出。
本题中所有数组下标均从 $0$ 开始。
你需要实现下面一个函数:
```cpp
std::vector eert(int N,std::vector f)
```
- 本题保证每个测试点仅会调用 $1$ 次该函数。
- $N$ 是这个树的节点个数,保证 $1\leq N\leq 10^7$。
- 树上点的编号从 $1$ 到 $N$。
- $f$ 是一个长度为 $N-1$ 的数组,其中 $f_i$ 表示点 $i+2$ 和点 $f_i$ 之间有条边,保证 $1\leq f_i \leq i+1$。
- 你需要返回一个大小为 $N$ 或者为 $0$ 的数组(`vector`)。具体的:如果有解,返回一个长度为 $N$ 的数组,表示你的答案;如果无解,返回一个空的数组。
- 你返回的数组设为 $ans$,你需要保证 $ans$ 是一个 $1-N$ 的排列,下标从 $0$ 开始,且对于 $1\leq i
输入格式
第一行一个整数 $N$,表示树的大小。
第二行 $N-1$ 个整数,表示数组 $f$。
输出格式
输出一行,表示交互结果,有以下几种情况:
1. `No` 表示你的函数返回无解;
2. `Wrong answer` 表示你的函数返回了错误的哈密顿路径(包括不合法的返回);
3. `Yes` 表示你的函数找到了正确的哈密顿路径。
其中,$2,3$ 会同时输出你的函数返回的排列。
说明/提示
**本地测试**
你可以在代码末尾加入如下代码测试(提交时请删去或注释掉)。
```cpp
#include
using namespace std;
namespace CHECKER{
int N;
vector f;
vector ans;
vector vis;
bool checker(){
if(ans.size()!=N) return 0;
for(int i=0;i