题解 | #小美的树上染色#

小美的树上染色

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;
}

全部评论

相关推荐

尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务