白魔法师

链接:https://ac.nowcoder.com/acm/contest/5600/C

题目描述
你是一个白魔法师。
现在你拿到了一棵树,树上有 nnn 个点,每个点被染成了黑色或白色。
你可以释放一次魔法,将某个点染成白色。(该点不一定是黑色点,也可以是白色点)
现在释放魔法后要保证最大的白色点连通块尽可能大。请求出最大白色连通块的大小。
注:所谓白色连通块,指这颗树的某个连通子图,上面的点全部是白色。
输入描述:
第一行输入一个正整数 nnn ,代表树的顶点数量。(1≤n≤1000001\leq n \leq 1000001≤n≤100000)
第二行输入一个长度为 nnn 的、仅由’W’和’B’组成的字符串,第 iii 个点为’W’代表该点为白色,'B’代表该点为黑色。
接下来的 n−1n-1n−1 行,每行输入两个正整数 xxx 和 yyy ,代表 xxx 点和 yyy 点有一条边连接。(1≤x,y≤n1\leq x,y\leq n1≤x,y≤n)
输出描述:
一个正整数,代表施放魔法后,最大的白色连通块的大小。
输入
4
WBBW
1 2
2 3
3 4
输出
2

思路:
有一次机会把一个点染成白色的,那么肯定要把黑点染成白色,这样的话与这个黑点相邻的所有白连通块就能连在一起形成一个更大的连通块了。
先用并查集预处理所有的白色点,求出白色连通块的大小,然后枚举黑色点,求与黑色点直接相邻的白色连通块的总的大小即可。注意特判全是白色点的情况。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n;
string s;
vector<int> e[N];
int f[N], cnt[N];
void init()
{for (int i = 0; i <= n; i++)f[i] = i;
}
int findd(int x)
{if (f[x] != x)f[x] = findd(f[x]);return f[x];
}
bool mergee(int x, int y)
{int fx = findd(x), fy = findd(y);if (fx == fy)return true;f[fy] = fx;cnt[fx] += cnt[fy];return false;
}
int main()
{cin >> n >> s;init();for (int i = 1; i <= n; i++)cnt[i] = (s[i - 1] == 'W');int u, v;for (int i = 1; i < n; i++){cin >> u >> v;e[u].push_back(v);e[v].push_back(u);if (s[u - 1] == 'W' && s[v - 1] == 'W')mergee(u, v);}if (cnt[findd(1)] == n){cout << n << endl;return 0;}int ans = 0;for (int i = 1; i <= n; i++){int sum = 1;if (s[i - 1] == 'B')for (auto j : e[i])sum += cnt[findd(j)];ans = max(ans, sum);}cout << ans << endl;return 0;
}

白魔法师(牛客小白月赛25 图、并查集)相关推荐

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

    对于这个题目,我的做法是换根dp, 因为可以选择将某一个点染成白色(不论之前的点是黑是白) , 做法如下: 将每个点当成根节点, 然后将根节点染成白色, 完全符合题意:: 首先dfs一下, 自底向上, ...

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

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

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

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

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

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

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

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

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

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

  7. 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)

    链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...

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

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

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

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

最新文章

  1. Windows DDK介绍,选择和安装
  2. 百度大脑发挥AI“头雁效应” 王海峰:在AI时代共同推动社会智能化升级
  3. Cocos2d-x移植WP8时间CCScrollView问题
  4. cms是什么意思啊_GC 知识点补充——CMS
  5. 详细的基于opencv svm hog的描述讲解
  6. .Net中url传递中文的解决方案
  7. 利用 squid 反向代理提高网站性能
  8. HTML5拖拽API的使用实例
  9. 电力行业巡检对讲通信系统
  10. vue脚手架根据需要进行配置
  11. html5 sencha,HTML5开发实战——Sencha Touch篇(1)
  12. hexo博客首页添加网易云音乐
  13. 六字诀教你辨肾脏是否健康
  14. Mac OS X 键盘快捷键
  15. php黄金搭档_动画电影电子游戏的搭档实际上很棒
  16. UML是什么?UML不是什么?
  17. 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植
  18. 还原一个真实的银行待遇
  19. leetcode:32. 最长有效括号
  20. 精准营销:从“广”告到“窄”告

热门文章

  1. jQuery1.7.1 API的基础教程整理和总结
  2. 2021年R1快开门式压力容器操作最新解析及R1快开门式压力容器操作证考试
  3. 1、 Seata快速开始
  4. 论文阅读: Towards Automatic Face-to-Face Translation
  5. 分频电路的verilog实现
  6. aoc usb显示器 linux,AOC首款USB连接云显示器
  7. HAL+Cube MX 学习之PWM
  8. 服务器系统安装优盘启动工具,u盘启动大师在Win10上安装和卸载远程服务器管理工具的方法...
  9. Leecode 1658. 将 x 减到 0 的最小操作数 滑动窗口
  10. 数仓建模之声明粒度 一文读懂什么是粒度 看完保证通透!