分析:
给出了父节点,要求到根节点的权重按p的顺序递增, 那么就可以从前往后一个一个赋值,依次加一,当时忽略了树的特性,忽略了节点之间的相互关系,WA了好几次,如果在进行依次递增赋值的过程中出现了父节点还没有被赋值但是子节点已经被赋值,那么此时应该输出-1.
代码:
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
vector<int> b(n + 1), p(n + 1);
int root;
for(int i = 1; i <= n; i ++) {
cin >> b[i];
if(b[i] == i) root = i;
}
for(int i = 1; i <= n; i ++) cin >> p[i];
if(p[1] != root) {
cout << -1 << '\n';
return ;
}
vector<int> dis(n + 1, -1);
dis[root] = 0;
for(int i = 2; i <= n; i ++) {
if(dis[b[p[i]]] == -1) {
cout << -1 << '\n';
return ;
}
dis[p[i]] = dis[p[i - 1]] + 1;
}
for(int i = 1; i <= n; i ++) {
cout << dis[i] - dis[b[i]] << ' ';
}
cout << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while(T --) {
solve();
}
}