Codeforces#596 DIV1のD / DIV2 F木工場

トピックへのリンク: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;
}

おすすめ

転載: www.cnblogs.com/mapleaves/p/11778007.html