手搓一个DSU的板子,根据题意合并类型相同的点,最后找到并查集中集合的最大siz,满足最大siz的都放进答案数组中,最后输出答案数组的大小和内容即可。
#include <iostream>
#include <vector>
#include <numeric>
struct DSU{
std::vector<int> f, siz;
DSU(int n){
f.resize(n + 1);
std::iota(f.begin(), f.end(), 0);
siz.assign(n + 1, 1);
}
int find(int x){
if(x != f[x]){
f[x] = find(f[x]);
}
return f[x];
}
bool same(int u, int v){
return find(u) == find(v);
}
bool merge(int u, int v){
int fu = find(u);
int fv = find(v);
if(fu == fv){
return false;
}
f[fv] = fu;
siz[fu] += siz[fv];
return true;
}
};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n;
std::cin >> n;
std::vector<int> a(n + 1);
for(int i = 1; i <= n; i++){
std::cin >> a[i];
}
DSU dsu(n);
for(int i = 1; i < n; i++){
int u, v;
std::cin >> u >> v;
if(a[u] == a[v]){
dsu.merge(u, v);
}
}
int maxsiz = 0;
for(int i = 1; i <= n; i++){
maxsiz = std::max(maxsiz, dsu.siz[dsu.find(i)];
}
std::vector<int> ans;
for(int i = 1; i <= n; i++){
if(dsu.siz[dsu.find(i)] == maxsiz){
ans.push_back(i);
}
}
std::cout << ans.size() << "\n";
for(int i = 0; i < ans.size(); i++){
std::cout << ans[i] << " \n"[i + 1 == ans.size()];
}
return 0;
}

京公网安备 11010502036488号