牛客小白月赛28 J

树上行走

https://ac.nowcoder.com/acm/contest/7412/J

分析

其实如果一条边链接了两个颜色不一样的节点,其实这个边根本没有任何意义,因为你从任意方向都不可能进入这条边,那么我们只需要用并查集维护集合数量就可以了。

代码

#include<bits/stdc++.h>
using namespace std;
int read() {
    int x = 0,f = 0;char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-') f = 1;ch = getchar();}
    while(isdigit(ch)) {x = x*10 + ch - '0';ch = getchar();}
    return f?-x:x;
}
const int N = 2e5+ 100;
int fa[N],si[N],n,val[N],vis[N],Ans;
vector<int> ans;
int find(int x) {return fa[x] == x?x:fa[x] = find(fa[x]);}
int main() {

    n = read();
    for(int i = 1;i <= n;i++) {
        val[i] = read();si[i] = 1;fa[i] = i;
    }
    for(int i = 1;i < n;i++) {
        int a = read(),b = read();
        if(val[a] == val[b]) {
            int fx = find(a),fy = find(b);
            fa[fx] = fy;si[fy] += si[fx];
        }
    }
    for(int i = 1;i <= n;i++) {
        int a = find(i);
        if(vis[a]) continue;
        if(Ans < si[a]) Ans = si[a];
    }
    for(int i = 1;i <= n;i++) {
        if(si[find(i)] == Ans) ans.push_back(i);
    }
    printf("%d\n",ans.size());
    for(auto y:ans) printf("%d ",y);
    return 0;
}
比赛题解 文章被收录于专栏

近期比赛的题解应该有吧。。。

全部评论

相关推荐

生命诚可贵:先不说内容怎么样 排版就已经太差劲了 第一眼看不到重点,第二眼已经没有再看的耐心了, 篇幅占的太满了 字体不要用灰色 观感不好 想重点突出的黑色加粗就可以了 多列要点 少些大段的句子 项目经历把项目用的技术要点列出来,光写个python plc什么的太宽泛了 自我评价也有点偏多
点赞 评论 收藏
分享
评论
6
3
分享

创作者周榜

更多
牛客网
牛客企业服务