题目描述:题目链接

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

1.bfs
我们可以用siz来记录这个连通块的大小,vis来记录这个点是否被访问到,sd记录每个点属于哪个连通块,因此利用bfs深搜的性质可得到所有连通块的大小。然后我们再逐个点处理,如果这个点是B,那么我们考虑如果将这个点染成白色之后的连通块大小,下面贴上代码

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m, cc, k, Maxsize;
int vis[N], sd[N], siz[N];
vector<int> g[N];
char ss[N];
void bfs(int s) {queue<int> q;q.push(s);vis[s] = 1;siz[k]++;sd[s] = k;while (q.size()) {int u = q.front();q.pop();for (auto v : g[u]) {if (!vis[v] && ss[v] == 'W') {vis[v] = 1;sd[v] = k;siz[k]++;q.push(v);}}}Maxsize = max(Maxsize, siz[k]);
}int main() {cin >> n;cin >> ss + 1;for (int i = 1; i <= n; i++) if (ss[i] == 'B') cc++;for (int i = 1; i < n; i++) {int x, y;cin >> x >> y;g[x].push_back(y);g[y].push_back(x);}for (int i = 1; i <= n; i++) {if (!vis[i] && ss[i] == 'W') {k++;bfs(i);}}int Max = 0;for (int i = 1; i <= n; i++) {int ans = 0;if (ss[i] == 'B') {for (auto v : g[i]) {ans += siz[sd[v]];}}Max = max(Max, ans + 1);}if (!cc) cout << Maxsize;else cout << Max;
}

2.并查集
同样我们可以利用并查集的性质将点与点联系起来,类似于kruskal算法中的应用。然后同理利用siz记录每个连通块的大小,最后对每个B节点处理过程如上。
下面给出代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int fa[N], cc;
char ss[N];
int siz[N], n, Maxsize;
vector<int> g[N];
int find(int x) {if (x == fa[x]) return x;else return fa[x] = find(fa[x]);
}void combine(int x, int y) {int t1 = find(x), t2 = find(y);if (t1 != t2) {if (siz[t1] >= siz[t2]) {fa[t2] = t1;siz[t1] += siz[t2];}else {fa[t1] = t2;siz[t2] += siz[t1];}}
}int main() {cin >> n;cin >> ss + 1;for (int i = 1; i <= n; i++) {fa[i] = i;if (ss[i] == 'W') siz[i] = 1;else cc++;}for (int i = 1; i < n; i++) {int x, y;cin >> x >> y;g[x].push_back(y);g[y].push_back(x);if (ss[x] == ss[y] && ss[x] == 'W') combine(x, y);}int Max = 0;for (int i = 1; i <= n; i++) {int ans = 0;if (ss[i] == 'B') {for (auto v : g[i]) {if (ss[v] == 'W') ans += siz[find(v)];}}Max = max(Max, ans + 1);}if (!cc) cout << n;else cout << Max;}

并查集:

bfs:

最后对比发现并查集在时间复杂度上确实优于bfs。

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

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

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

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

    链接:https://ac.nowcoder.com/acm/contest/5600/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 图、并查集)

    白魔法师 链接: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

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

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

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

  9. 牛客小白月赛6 - C.桃花(DFS/BFS)

    桃花一簇开无主,可爱深红映浅红. --<题百叶桃花> 桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花.HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花 ...

最新文章

  1. C语言atoi()函数(字符串转整数int类型)(atol()转换为long)
  2. MySQL(2)数据库管理
  3. 世上最简单的mysql_最简单易懂的mysql安装教程
  4. C/C++知识分享:C++常用内置函数你会几个,使用过几次呢?
  5. 将一个普通 JAR 文件打包为 plugin 的一个问题
  6. RxJava2:Observable和Observer如何传递
  7. Ncurses 命令行图形库
  8. Wss3入门(2):设置匿名访问包括匿名阅读和匿名评论,修改评论的字段等。
  9. pdf如何转换成excel?教你几个方法
  10. Android监听手机网络变化
  11. BIND的进阶二:视图,日志,转发,子域的授权
  12. phpMyAdmin - 配置文件权限错误,不应任何用户都能修改!
  13. Cloudera Manager 5.14.X 安装部署(上)
  14. recyclerview中viewholder使用viewbinding
  15. python文本分析与挖掘(一)-构建语料库
  16. HDD/SSD基础知识及工作原理
  17. 处理LetsEncrypt证书签发错误acme-v02.api.letsencrypt.org timeout
  18. python中主函数用法_【Python 1-13】Python手把手教程之——详解函数和函数的使用...
  19. C语言中左移右移运算规则
  20. 人人说英语赠送绕口令

热门文章

  1. Hexo(sakura)自定义标签云
  2. [轻松一下] 大热天的宿舍太热了,来网吧敲代码
  3. qq申诉网站无法接到服务器,为什么我qq申诉不成功 - 卡饭网
  4. unionpay 云闪付小程序开发包
  5. 金山快盘 linux,WPS移动版5.5发布 支持金山快盘双向读写
  6. TSN算法的PyTorch代码解读(训练部分)
  7. 训练日志13 (8.7)
  8. 剑网三修复选择服务器,老玩家回坑剑网三去哪个区服,要注意啥?这有一份终极宝典请查收...
  9. 汽车安全标准ISO-26262以及等级ASIL
  10. LKJ国锂科技一场影响人类生活的大变革