树上行走
思路
用并查集维护集合个数,找到最大的集合,从小到大输出集合里面的元素,若有多个最大集合,从小到大依次输出。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int fa[N], val[N], n, son[N];
void init(int n)
{
for(int i = 1; i <= n; i++)
fa[i] = i, son[i] = 1;
}
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
void merge(int x, int y)
{
int fx = find(x), fy = find(y);
if(fx != fy)
fa[fx] = fy, son[fy] += son[fx];
}
int main()
{
scanf("%d", &n);
init(n);
for(int i = 1; i <= n; i++)
scanf("%d", &val[i]);
int cnt = 1;
for(int i = 1; i <= n-1; i++)
{
int u, v;
scanf("%d%d", &u, &v);
if(val[u] == val[v])
merge(u, v), cnt = max(cnt, son[find(v)]);
/*cout << cnt << endl;
system("pause");*/
}
int num = 0;
for(int i = 1; i <= n; i++)
if(son[find(i)] == cnt)
num++;
cout << num << endl;
for(int i = 1; i <= n; i++)
if(cnt == son[find(i)])
cout << i << ' ';
//system("pause");
return 0;
}