题目: 传送门
思路: 对于每个 不尊重祖先的 节点 ,看其是否有节点 尊重他 ,如果有就不删去,如果没有就删去 , 尊重节点的祖先一定不被删去.
虽然是DFS,但其实每个点只遍历一次,所以复杂度不会很高.
vector<int> v[100500];
vector<int> ans;
int p[100500];
int vis[100500];
void dfs(int now,int ps) {
if(p[now]!=0) {
if(ps == 1&&vis[now]==0) {
ans.push_back(now);
for(int i=0;i<v[now].size();i++) {
dfs(v[now][i],ps);
}
}
else {
if(vis[now]==1) {
for(int i=0;i<v[now].size();i++) {
dfs(v[now][i],p[i]);
}
}
else {
ans.push_back(now);
for(int i=0;i<v[now].size();i++) {
dfs(v[now][i],ps);
}
}
}
}
else {
for(int i=0;i<v[now].size();i++) {
dfs(v[now][i],p[i]);
}
}
}
int main() {
int n;
cin>>n;
int root = 0;
for(int i=1;i<=n;i++) {
int f;
cin>>f>>p[i];
if(f==-1) root = i;
else {
v[f].push_back(i);
if(p[i]==0) vis[f] = 1;
}
}
dfs(root,0);
if(ans.empty()) {
cout<<"-1"<<endl;
return 0;
}
sort(ans.begin(), ans.end());
for(int i=0;i<ans.size();i++) {
cout<<ans[i];
if(i!=ans.size()-1) cout<<' ';
else cout<<endl;
}
return 0;
}