题意: 解法: 从点1开始dfs,维护树链每种颜色出现的次数, 遍历到点x的时候,如果c[x]未出现过则满足条件,否则不满足条件. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=2e6+5; vector<int>g[maxm]; int mark[maxm]; int ans[maxm]; int a[maxm]; int n; void dfs(int x,int fa){ if(!mark[a[x]]){ ans[x]=1; } mark[a[x]]++; for(int v:g[x]){ if(v==fa)continue; dfs(v,x); } mark[a[x]]--; } void solve(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<n;i++){ int a,b;cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } dfs(1,1); for(int i=1;i<=n;i++){ if(ans[i]){ cout<<i<<endl; } } } signed main(){ ios::sync_with_stdio(0); solve(); return 0; }