链接:https://ac.nowcoder.com/acm/contest/5600/C
来源:牛客网

题目描述
你是一个白魔法师。
现在你拿到了一棵树,树上有 个点,每个点被染成了黑色或白色。
你可以释放一次魔法,将某个点染成白色。(该点不一定是黑色点,也可以是白色点)
现在释放魔法后要保证最大的白色点连通块尽可能大。请求出最大白色连通块的大小。
注:所谓白色连通块,指这颗树的某个连通子图,上面的点全部是白色。
输入描述:

第一行输入一个正整数 ,代表树的顶点数量。
第二行输入一个长度为 的、仅由’W’和’B’组成的字符串,第 个点为’W’代表该点为白色,'B’代表该点为黑色。
接下来的 行,每行输入两个正整数 和 ,代表 点和 点有一条边连接。

输出描述:

一个正整数,代表施放魔法后,最大的白色连通块的大小。

示例1
输入
复制

4
WBBW
1 2
2 3
3 4

输出
复制

2

给定一个树,树上有黑节点和白节点,现在你可以修改一个点为白色,问修改哪个点
可以使得修改后白色的联通块最大?

  • 用并查集维护联通块的节点个数
  • 枚举每个黑点UUU,则修改UUU会使得UUU的白色联通块个数变成1+∑白色相邻节点的联通块节点个数1+\sum{白色相邻节点的联通块节点个数}1+∑白色相邻节点的联通块节点个数
  • 求个MaxMaxMax即可

注意 :我以前用的并查集模板路径压缩是错的,居然还一直没有发现

//错误的路径压缩
int find(int x) {int ret = x;while(pre[ret] != -1)ret = pre[ret];if(ret != x) pre[x] = ret;return ret;
}

正确的路径压缩如下

int find(int x){return f[x]==x?x:f[x]=find(f[x]);
}

感谢 7QQQ**** 大佬的指正

完整代码如下

#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>
#define MAXN (100005)
#define int long long int
#define INF (0x7f7f7f7f)
#define QAQ (0)#pragma GCC optimize(2)using namespace std;#ifdef debug
#define show(x...) \do { \cout << "\033[31;1m " << #x << " -> "; \err(x); \} while (0)
void err() { cout << "\033[39;0m" << endl; }
#endiftemplate<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }int n, m, Q, K, pre[MAXN], sum[MAXN];vector<int> G[MAXN];
char color[MAXN];#if 0
//我常用的并查集模板
//今天发现写这道题TLE了   这是个大问题   这是个大问题
//这个是错误的路径压缩这个是错误的路径压缩这个是错误的路径压缩这个是错误的路径压缩
//
int find(int x) {int ret = x;while(pre[ret] != -1)ret = pre[ret];if(ret != x) pre[x] = ret;return ret;
}#else#define f pre
int find(int x){return f[x]==x?x:f[x]=find(f[x]);
}
#endif#if 0
void union_xy(int x, int y) {int rx = fa(x), ry = fa(y);if(rx != ry) {sum[rx] += sum[ry];pre[ry] = rx;}
}
#endif
void init() {//  memset(pre, -1, sizeof(pre));for(int i=1; i<=n; i++) pre[i] = i;
}signed main() {#ifdef debugfreopen("test", "r", stdin);clock_t stime = clock();
#endifscanf("%lld %s ", &n, color+1);init();for(int i=1, u, v; i<n; i++) {scanf("%lld %lld ", &u, &v);G[u].push_back(v), G[v].push_back(u);if(color[u] == color[v] && color[u] == 'W') {int rx = find(u), ry = find(v);pre[rx] = ry;}}int ans = 0;for(int i=1; i<=n; i++) {int rx = find(i);sum[rx] ++;ans = max(ans, sum[rx]);}for(int i=1; i<=n; i++) {if(color[i] == 'B') {int tmax = 1;for(auto v : G[i]) {if(color[v] == 'W') tmax += sum[find(v)];}ans = max(tmax, ans);}}printf("%lld\n", ans ? ans : n);#ifdef debugclock_t etime = clock();printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endifreturn 0;
}

牛客小白月赛25 C 白魔法师 并查集相关推荐

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

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

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

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

  3. 牛客小白月赛2 D. 虚虚实实(欧拉回路,并查集)

    题目描述 震为雷,临危不乱,亨通畅达:巽为风,柔顺伸展,厚载万物. 震卦:洊雷,震,君子以恐惧修省.一口金钟在淤泥,人人拿着当玩石,忽然一日钟悬起,响亮一声天下知. 巽卦:随风,巽,君子以申命行事.一 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. html display布局,Web布局:display属性
  2. c语言位运算符读音,C语言六种位运算符
  3. makefile多目录的.c 格式.cpp混合编译
  4. Maven+struts2+spring4+hibernate4的环境搭建
  5. Zabbix Server安装
  6. 前端开发中如何将文件夹中的图片变为背景图_Web中的图像技术全面总结,长文干货!...
  7. 零点追踪(零点及量程补偿)
  8. java 微服务源码_Redkale 1.9.4 Java 分布式微服务框架
  9. Anroid 开发so文件找不到问题-例高德地图SDK提示com.autonavi.amap.mapcore.MapCore.nativeNewInstance问题
  10. 开源渗透测试工具合集
  11. 陕西2020行政区划调整_陕西2020行政区划调整
  12. 自己总结出三种进入加密QQ空间的方法
  13. java多线程之Guarded Suspension模式
  14. 得链表者得天下(中)
  15. 常见计算机主机内部硬件设备,计算机的硬件主要包括中央处理器、储存器、输出设备和...
  16. 数据结构实验一_图书馆信息管理系统
  17. 【原创】遥感影像法分析河流演变
  18. 估值超过3个小米!独角巨兽蚂蚁金服养成记
  19. grafana bar gauge使用问题
  20. SOD领域RGBD算法-训练集设置

热门文章

  1. getTime()得到时间戳不一样
  2. 【前端修炼场】 — 这些标签你学会了么?快速拿下 “hr”
  3. 计算机语言的巴别塔——ANSI Unicode编码
  4. 『.Net』微软家的女儿们
  5. 考研英语十附双语阅读:按点下班惹非议?一点小花招让你看起来超努力(纯阅读,有些方法不普适)
  6. 华为软件迁移实践微认证试题库
  7. Spring创建对象基本过程
  8. 《浏览器工作原理与实践》学习笔记
  9. 小眼游戏架构:UI篇:系统功能(新手引导)
  10. Python基础入门知识(11)