对于这个题目,我的做法是换根dp, 因为可以选择将某一个点染成白色(不论之前的点是黑是白) , 做法如下:

将每个点当成根节点, 然后将根节点染成白色, 完全符合题意;;

首先dfs一下, 自底向上,求出每一个点在子树内的白色连通块大小。

然后从上到下开始算对孩子节点的贡献::

如果当前点是黑色, 那么对儿子节点肯定没有贡献 , 因为上面的所有节点都被这个黑色节点隔开了,下面的节点不能和上面的节点连接;

如果当前节点是白色 :

    如果孩子节点是黑色, 那么在第一次dfs的时候,孩子节点肯定对这个父亲节点没有贡献, 那么就当前节点对孩子节点直接传递下去dp[u]如果孩子节点是白色, 那么在第一次dfs的时候,孩子节点肯定对这个父亲节点有贡献, 那么当前节点对孩子节点的贡献就是dp[u] - dp[x] ,剪掉孩子的贡献, 避免重复计算
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <map>
#include <list>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stack>
#pragma GCC optimize(3 , "Ofast" , "inline")
using namespace std ;
typedef long long ll ;
const double esp = 1e-6 , pi = acos(-1) ;
typedef pair<int , int> PII ;
const int N = 1e6 + 10 , INF = 0x3f3f3f3f , mod = 1e9 + 7;
int in()
{int x = 0 , f = 1 ;char ch = getchar() ;while(!isdigit(ch)) {if(ch == '-') f = -1 ; ch = getchar() ;}while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;return x * f ;
}
int col[N] , dp[N]  , n ;
vector<int> v[N] ;
void dfs(int u , int f)
{dp[u] = col[u] ;for(auto x : v[u]){if(x == f) continue ;dfs(x , u) ;if(col[x]) dp[u] += dp[x] ;}return ;
}
int ans = 0 ;
void dfs1(int u , int f , int sum)
{//  cout << u << " " << f << " " << sum << " " << dp[u] << endl ;dp[u] = dp[u] + sum + (col[u] == 0);ans = max(ans , dp[u]) ;for(auto x : v[u]){if(x == f) continue ;dfs1(x , u , (col[u] ?(col[x] ? dp[u] - dp[x] : dp[u]):0)) ;}
}
int main()
{n = in() ;string s ;cin >> s ;s = " " + s ;for(int i = 1 ; i <= n ;i ++ ) col[i] = s[i] == 'W' ;for(int i = 1; i < n ;i ++ ){int a = in() , b = in() ;v[a].push_back(b) , v[b].push_back(a) ;}dfs(1 , 0) ;dfs1(1 ,0 ,  0) ;cout << ans << endl ;return 0 ;
}
/*
13
WBWWBBBBBWWWB
1 2
1 3
2 4
2 5
3 6
3 7
5 8
8 10
8 11
7 9
9 12
9 134
*/

白魔法师-牛客小白月赛25相关推荐

  1. 牛客小白月赛25 C.白魔法师

    牛客小白月赛25 C.白魔法师 题目链接 题目描述 你是一个白魔法师. 现在你拿到了一棵树,树上有 个点,每个点被染成了黑色或白色. 你可以释放一次魔法,将某个点染成白色.(该点不一定是黑色点,也可以 ...

  2. 牛客小白月赛25 D.抽卡

    牛客小白月赛25 D.抽卡 题目链接 题目描述 王子连接的国服终于上线啦~ 已知王子连接的抽卡系统如下: 共有 n 个卡池,第 个卡池共有 aia_iai​ 种卡,每张卡的出货率都是相等的(也就是说该 ...

  3. 白魔法师--图的连通块问题(牛客小白月赛25)

    链接:题目链接 来源:牛客网 白魔法师 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 你 ...

  4. 牛客小白月赛25 C 白魔法师 并查集

    链接:https://ac.nowcoder.com/acm/contest/5600/C 来源:牛客网 题目描述 你是一个白魔法师. 现在你拿到了一棵树,树上有 个点,每个点被染成了黑色或白色. 你 ...

  5. 白魔法师(牛客小白月赛25 图、并查集)

    白魔法师 链接:https://ac.nowcoder.com/acm/contest/5600/C 题目描述 你是一个白魔法师. 现在你拿到了一棵树,树上有 nnn 个点,每个点被染成了黑色或白色. ...

  6. 牛客小白月赛25 补题+题解[A-J]

    加油加油加油! 文章目录 A.AOE还是单体? B.k-size字符串 C.白魔法师 D.抽卡 E.点击消除 F.疯狂的自我检索者 G.解方程 H.神奇的字母(二) I.十字爆破 J.异或和之和 A. ...

  7. 牛客小白月赛25 C白魔法师 (bfs | 并查集)

    题目描述:题目链接 题意分析: n个节点 n-1条边,非常明显的树形结构(题目中就有说 ),因此不需要考虑环的情况. 树上有两种颜色,一种是白色一种是黑色,我们可以推断出这题应该是考虑连通块的大小,那 ...

  8. 牛客小白月赛25 C-白魔法师 ( 图论 + 并查集 )

    题目链接 解题报告: 思路:如果将一个黑色点染成白色,那么将得到一个白色连通块,这个连通块由和这个黑色点连结的所有白色连通块组成. 如果将一个白色点染成白色,那么不会有任何变化. 所以我们可以先并查集 ...

  9. 牛客小白月赛23(A、B

    牛客小白月赛 A.膜法记录 题意: 给n行m列的矩阵,矩阵中的每个位置都可能有敌人 现在你能消灭a行和b列的敌人,问是否有可能将所有敌人都消灭. 数据范围:n<=20,m<=1e5 思路: ...

最新文章

  1. python编程问题--第二次
  2. Intel 6系列芯片组设计缺陷 全球出货暂停
  3. php视图,thinkPHP框架中视图的讲解(附代码)
  4. 一些著名的软件都用什么语言编写?
  5. ensp安装对电脑配置要求高吗_直线导轨有哪些安装方法?为什么直线导轨安装精度要求高?...
  6. 20141215胡思乱想
  7. [学习OpenCV攻略][001][Ubuntu安装及配置]
  8. 转行前端很迷茫,该怎么办?
  9. 模仿下列程序自己打印一个趣味图案c语言,趣味程序导学C语言(28页)-原创力文档...
  10. aix如何查看日志策略_AIX系统日志学习笔记之一
  11. 【21.00%】【vijos P1018】智破连环阵
  12. MySQL基础系列之 记一次利用存储过程实现2600万数据水平分表
  13. 中债登——各功能快捷入口
  14. 故障码(DTC)状态解析
  15. leetcode-数据结构-566. 重塑矩阵
  16. DeepCachNet A Proactive Caching Framework Based on Deep Learning in Cellular Networks论文阅读
  17. spring编程式和声明式事务控制
  18. 安装radis看我就可以了
  19. 富士胶片首次参展贵阳数博会;佳能携多元化专业影像设备亮相CCBN2021;七彩虹建设国内首家GPU博物馆 | 全球TMT...
  20. 微信小程序-如何解决view中放纯数字或字母不会自动换行?【亲测有效】

热门文章

  1. PgSQL修改字段备注
  2. 关于软件项目code name代号命名
  3. 结合d3.js实现气象数据的可视化
  4. 服务器光驱坏了怎么虚拟化,光驱坏了或者没有光驱怎么装系统?
  5. html插入swf自动播放,[转载]网页中插入FLASH(swf文件)的html代码
  6. 一款纯粹的在线视频App,基于Material Design + MVP + RxJava + Retrofit + Realm
  7. Games104 Lecture 7 游戏中渲染管线、后处理和其他的一切
  8. 晶体三极管工作模式判断
  9. INTERSECT –谓词中被低估的双向
  10. 使用级联Softmax和广义大幅度损失训练的改进DCNN进行细粒度图像分类