ポイント数に - より小さいサブツリーの現在のノードのツリーノードにcodeforces D.番号

トピックリンクします。https://codeforces.com/contest/1287/problem/Dの
効果の対象に:
、あなたの[i]とC [i]の数のそれぞれの木を与えます。C [I]:すべての子ノードI jは、[I]> [jが満足 ] ノードの数です。今祖先ノードNとC [I]を使用して、[I](1 <=割り当てることを可能にする [I] <= 1E9)を。
出力がNOを割り当てることができない場合は、YESの場合には、各点の出力と[i]が出力されてもよいです。
ここに画像を挿入説明
ここに画像を挿入説明

#include <bits/stdc++.h>
#define LL long long
using namespace std;
 
struct node{
    int to;
    int c;
};
vector <node> v[2005];
int vis[2005], f=0;
int pos[2005];
 
vector<int> dfs(int u, int fa){
 
    vector<int> a;
    for(int i=0; i<v[u].size(); i++){
        int to=v[u][i].to;
        if(to!=fa){
            vector<int> b=dfs(to, u);
            for(int i=0; i<b.size(); i++){
                a.push_back(b[i]);
            }
        }
    }
    if(vis[u]>a.size()){//NO
        f=1;
    }
    else{//插入到子节点序列中
        a.insert(a.begin()+vis[u], u);
    }
    return a;
}
 
int main()
{
 
    int n, root;
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        int a, b;
        scanf("%d%d", &a, &b);
        if(a){
            v[i].push_back(node{a, b});
            v[a].push_back(node{i, b});
        }
        else{
            root=i;
        }
        vis[i]=b;
    }
    vector <int> a=dfs(root, -1);
 
    if(f){
        printf("NO\n");
        return 0;
    }
 
    int p=1;
    for(int i=0; i<a.size(); i++){//编号
        pos[a[i]]=p++;
    }
 
    printf("YES\n");
    for(int i=1; i<=n; i++){
        printf("%d ", pos[i]);
    }
 
    return 0;
}
公開された374元の記事 ウォン称賛22 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq_21433411/article/details/103866000