トピックへのリンク:https://codeforces.com/contest/1246/problem/D
問題の意味:Nノードはn個のノードの竹のツリー構造のための要件があり、根とツリーにありますが、各ノードがある唯一の子ノードが、一つだけノードが子ノードを持っていない竹根ざした木。親ノードは、親ノードvの親ノードのルートは、V及びVサブツリーの移動操作ではないではないルートノードv及びvのための場合は、竹は、とすることができます。各ノードは、少なくとも竹の木、竹の出力番号、操作の数になると、各操作のオブジェクトを操作する方法を多くの操作尋ねる、竹の数をカスタマイズすることができます。
プラクティス:非常に(書き込み)している(いない)イタリア(アウト)は、構成(に)だと思います。オペレーションの各点のみ-1の深さ、すなわちサブツリーを行いますので、最初、下限が締結されている回答のn-1-DEP(ツリーの深さDEP)、その-1の最大深さの最大値。それぞれのツリー構造を有する竹与えられた場合を考慮逆に、一方の縁部に沿って下方に移動するサブツリーの動作を選択し、移動体の数は、従って、N-1-DEPである必要があり、操作これは、n-1-DEPの数にバインドされています。建設プロセスは、チェーンツリー最も深いノードは、非常に微妙な参照コードDUの教師は、特定の実装コードを参照してください場合は、最後に位置しています。
参照コード:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 100005;
vector<int> sequence, operation, son[MAXN];
int cnt, heavyson[MAXN], dep[MAXN], father[MAXN], n;
void dfs(int now)
{
sequence.push_back(now);
for (int i = 0; i < cnt; ++i)
operation.push_back(now);
cnt = 0;
for (auto v:son[now])
if (v != heavyson[now])
dfs(v);
if (heavyson[now])
dfs(heavyson[now]);
cnt++;
}
int main()
{
cin >> n;
dep[0] = 1;
for (int i = 1; i < n; ++i)
{
cin >> father[i];
son[father[i]].push_back(i);
dep[i] = dep[father[i]] + 1;
}
int maxdep = max_element(dep, dep + n) - dep;
int heavysonnode = maxdep;
while (heavysonnode)
{
heavyson[father[heavysonnode]] = heavysonnode;
heavysonnode = father[heavysonnode];
}
dfs(0);
for (int i = 0; i < n; ++i)
{
if (i != 0)
cout << " ";
cout << sequence[i];
}
cout << endl;
cout << (int) operation.size() << endl;
for (int i = 0; i < (int) operation.size(); ++i)
{
if (i != 0)
cout << " ";
cout << operation[i];
}
return 0;
}