CodeForces- 1143C Queen(dfs)

题目: 传送门
思路: 对于每个 不尊重祖先的 节点 ,看其是否有节点 尊重他 ,如果有就不删去,如果没有就删去 , 尊重节点的祖先一定不被删去.
虽然是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;
}

猜你喜欢

转载自blog.csdn.net/qq_43305984/article/details/89305944