题解 | #小美的树上染色#
小美的树上染色
https://www.nowcoder.com/practice/c970c2839ca8440685f2504c236d5d62
我们可以直接dfs这棵树,在回溯的时候判断,如果当前节点和其父亲是满足条件的且都是白色节点,那么一定可以将其染色,因为这时一定代表着当前节点 u 不存在儿子 v ,使得 u v 满足条件,不然 u 已经是红色了,这样贪心的染色一定可以染出最大答案
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int __t = 1, n, u, v, w[N], vis[N], ans = 0;
vector<int> g[N];
void dfs(int u, int d) {
for (auto v : g[u]) {
if (v == d)
continue;
dfs(v, u);
}
if (vis[u] || vis[d] || d == 0)
return;
int num = w[d] * w[u];
if (sqrt(num) == (int)sqrt(num)) {
vis[u] = vis[d] = 1;
ans += 2;
}
return;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> w[i];
for (int i = 1; i <= n - 1; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 0);
cout << ans << '\n';
return;
}
int32_t main() {
#ifdef ONLINE_JUDGE
ios::sync_with_stdio(false);
cin.tie(0);
#endif
// cin >> __t;
while (__t--)
solve();
return 0;
}


