若某个白色节点A存在多个相邻节点,但其中只有一个相邻的白色节点,满足双方权值的乘积是完全平方数,那么节点A也是叶子节点。 本题有一个关键的说明,也就是第一句话:小美拿到了一棵树。既然是树,那么就不存在环。因此根据贪心的思想,我们每次只取【叶子】节点和【叶子】节点相邻的节点涂成红色,然后再把红色部分剪枝...
小美的树上染色题解 题目:小美拿到了一棵树,每个节点有一个权值。初始每个节点都是白色。 小美有若干次操作,每次操作可以选择两个相邻的节点,如果它们都是白色且权值的乘积是完全平方数,小美就可以把这两个节点同时染红。小美想知道,自己最多可以染红多少个节点? 思路:由于只在乎相邻节点权值乘积为完全平方数的,所...
代码 神奇的代码 cpp #include<bits/stdc++.h>#defineendl'\n'#defineint long longconstintmaxn =1e5+5;std::vector<int> tree[maxn];intvis[maxn];intval[maxn];intans =0;voiddfs(ints,intfa){for(inti =0; i < tree[s].size(); i++){intt = tree[s][i];if(t == fa)continue;df...
小美的树上染色 https://www.nowcoder.com/practice/c970c2839ca8440685f2504c236d5d62我们可以直接dfs这棵树,在回溯的时候判断,如果当前节点和其父亲是满足条件的且都是白色节点,那么一定可以将其染色,因为这时一定代表着当前节点 u 不存在儿子 v ,使得 u v 满足条件,不然 u 已经是红色了,这样贪心的染色...
题解| 小美的树上染色 def solve(): # Read input n = int(input()) # Node values, 1-indexed w = [0] + list(map(int, input().split())) # Create adjacency list representation of the tree g = [[] for _ in range(n + 1)] for _ in range(n - 1): u, v = map(int, ...
小美的树上染色 这是题面 思路 题目的限制条件有两个 节点需要是相邻的 都还没被访问过并且乘积是一个完全平方数 然后求最多能访问多少个节点 如果从根开始考虑的话,可能不是很好想,因为跟可能有很多儿子,和哪个儿子结合呢?好像不好想 那我们可以试着从叶子节点开始考虑,因为叶子节点能够结合的只有它们的父亲 ...
提供一种DP的思路;dp[i][0/1]表示第i个结点染色不染色/染色的最大的染色数量。那么对于dp[i][0]来说就是它的子节点的染色最大树量的和,dp[i][1]则需要再来一轮循环,统计某个子节点与父节点一起染色的最大值。 #include usin_牛客网_牛客在手,offer不愁
小美的树上染色 https://www.nowcoder.com/practice/c970c2839ca8440685f2504c236d5d62#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll>PII; const int N = 1e5 + 10; const int MOD = 998244353; const int INF = 0X3F3F3F3F; const int dx[] = {...