【題目敘述】https://atcoder.jp/contests/abc198/tasks/abc198_e
【解題想法】DFS,樹DP
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 100005;
int C[maxn];
int cnt[maxn];
int ans[maxn];
vector <int> G[maxn];
void dfs(int now, int pre) {
cnt[C[now]]++;
if (cnt[C[now]] == 1) ans[now] = 1;
for (auto nxt : G[now]) {
if (nxt == pre) continue;
dfs(nxt, now);
}
cnt[C[now]]--;
}
int main() {
int N, A, B;
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> C[i];
}
for (int i = 1; i < N; i++) {
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 << "\n";
}
return 0;
}