#Z1103. good point
Description
给你一棵树,N个点,每个点都有其颜色,树的根结点为1号点
我们称一个点X是一个good point,仅当:
从顶点1到顶点X的路径上,没有别的顶点,其颜色与X的颜色是一样的
Format
Input
一行给出数字N
接下来1行,给出N个顶点的颜色,其值<=1e5
接下来N-1行描述这个树
N<=1e5
Output
一行一个数字,从小到大输出所有good point
Samples
输入数据 1
6
2 7 1 8 2 8
1 2
3 6
3 2
4 3
2 5
Copy
输出数据 1
1
2
3
4
6
思路
用桶记录颜色出现了几次,如果
ton[col[x]] == 0
则加入答案数组即可。
代码
#include <bits/stdc++.h>
using namespace std;
int col[10000001],n,u,v,ton[1000001],ans[1000001],al;
vector<int> vec[100001];
void dfs(int x,int fa)
{
if(ton[col[x]] == 0) ans[++al] = x;
ton[col[x]]++;
for(int i = 0;i < vec[x].size();i++)
if(vec[x][i] != fa)
dfs(vec[x][i],x);
ton[col[x]]--;
}
int main()
{
cin>>n;
for(int i = 1;i <= n;i++) cin>>col[i];
for(int i = 1;i < n;i++)
{
cin>>u>>v;
vec[u].push_back(v);
vec[v].push_back(u);
}
dfs(1,0);
sort(ans + 1,ans + 1 + al);
for(int i = 1;i <= al;i++) cout<<ans[i]<<endl;
return 0;
}