题意:
给你一棵树, 还原树上每个节点的价值, 首先树上的每个节点都有一个数,代表这个节点子树中有多少个节点的价值小于当前节点。
思路:
对于每一个节点,我们维护一个数组,然后数组中的值就是当前节点和当前节点子树的编号, 然后数组中的下标就代表每个节点的价值。
dfs 回溯之后,我们就可以知道当前节点插入到数组的哪一个位置。
对于怎么维护一个数组, 我们就可以用 vector 。vector 支持插入操作。
反思:
做这个题的时候, 完全没有想到要维护一个数组。
所以就无从下手。
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N = 3000;
int n,m,p,val[N],rt,ans[N];
vector<int>f[N];
vector<int> dfs(int x){
vector<int>res;
for (auto it: f[x]){
vector<int>now = dfs(it);
res.insert(res.end(), now.begin(), now.end());
}
if (val[x] > res.size()){
puts("NO");
exit(0);
}
res.insert(res.begin() + val[x], x);
return res;
}
int main(){
scanf("%d",&n);
for (int i = 1; i <= n; ++i){
scanf("%d%d",&p,&val[i]);
if (p == 0) rt = i;
f[p].pb(i);
}
vector<int> v = dfs(rt);
for (int i = 0; i < n; ++i)
ans[v[i]] = i + 1;
printf("YES\n");
for (int i = 1; i <= n; ++i)
printf("%d ",ans[i]);
return 0;
}