题解 | #好子树#

好子树

https://www.nowcoder.com/practice/aca56bd0c9414c71b94d3a2851f4e0e7

#include <iostream>
#include <vector>
using namespace std;

int dfs(int p,vector<vector<int>> &edges,vector<int> &nums,int &maxnum,int &minnum){
    int ma=nums[p],mi=nums[p],n=0;
    for(auto a:edges[p]) n+=dfs(a,edges,nums,ma,mi);
    maxnum=max(maxnum,ma);
    minnum=min(minnum,mi);
    if((ma-mi)%2==1){
        n++;
        nums[p]=-1;
    }
    return n;
}

int main() {
    int n,u,v;
    cin>>n;
    vector<int> nums(n);
    vector<vector<int>> edges(n);
    for(int i=0;i<n;i++) cin>>nums[i];
    while(cin>>u>>v) edges[u-1].emplace_back(v-1);
    int maxnum=nums[0],minnum=nums[0];
    cout<<dfs(0,edges,nums,maxnum,minnum)<<endl;
    for(int i=0;i<n;i++) if(nums[i]==-1) cout<<i+1<<' ';
    return 0;
}

利用dfs深度优先搜索解题。nums数组存储节点权值,edges二维数组存储边。对于一个节点,搜索其下一节点,并返回子树的最大最小值。若差值为奇数则为将该节点p标记(可直接将nums[p]赋值为-1来标记以节省空间,反正后续也不再需要用到p的权值)

全部评论

相关推荐

SHC2:关键问题是你这三段实习是三个不同的岗位…你这样子秋招就是只有一段实习的本科生..
点赞 评论 收藏
分享
双非阴暗爬行:我来看看笑死我了,这名字取得好想笑(没有不好的意思)
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务