220726 T1 树染色问题 (树的直径)
题目描述
高钧在校园中漫步时,经过了一棵树。这时,几个同学突然冒出来控制住了他。
这棵树有 nn 个节点, 每个节点有黑白两种颜色, 为了更好的 alb , 需要把所有节点染成同一种颜色。
为了更好的戏耍高钧,高钧被告知如果他在最短的时间内把这棵树的所有节点染成同一种颜色, 那他就不会被 alb。
高钧每次操作可以将一个同色连通块染成另一种颜色,他想知道他最少需要几次操 作才能把这棵树的所有节点染成同一种颜色。
对于树上的一个点集 SS , 它是这棵树的同色连通块当且仅当对于所有节点 i,j∈Si,j∈S,节点 ii 的颜色与节点 jj 的颜色相同且树上 ii 与 jj 简单路径上的所有点属于 SS 。
输入格式
第一行一个整数 nn 表示树的节点数。
第二行 nn 个整数 c_i∈ \{0,1 \}ci∈{0,1} 表示第 ii 个节点的初始颜色。
接下来 n-1n−1 行,每行两个整数 a_i,b_iai,bi,表示树上的一条边。
输出格式
输出一行一个整数,表示最少的操作次数。
先将原图缩点,再找出新树的直径的中心,以他为根,答案就是直径长度除以2。
1 #include <bits/stdc++.h>
2 //#define loveGsy
3 using namespace std;
4 const int N = 2e5 + 10;
5 vector<int> E[N];
6 int n, T, rt;
7 int col[N], d[N], a[N], b[N], bl[N];
8 int read() {
9 int x = 0, f = 1; char c = getchar();
10 while (c < '0'||c > '9') {if (c == '-') f = -1; c = getchar();}
11 while (c >= '0'&&c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
12 return x * f;
13 }
14
15 void dfs(int u, int f) {
16 if (col[u] == col[f]) bl[u] = bl[f];
17 else bl[u] = ++T;
18 for (int i = 0; i < (int)E[u].size(); i++) {
19 int t = E[u][i];
20 if (t == f) continue;
21 dfs(t, u);
22 }
23 }
24
25 void dfs1(int u, int f) {
26 d[u] = d[f] + 1;
27 if (d[u] > d[rt]) rt = u;
28 for (int i = 0; i < (int)E[u].size(); i++) {
29 int t = E[u][i];
30 if (t == f) continue;
31 dfs1(t, u);
32 }
33 }
34
35 int main() {
36 #ifdef loveGsy
37 freopen("tree.in", "r", stdin);
38 freopen("tree.out", "w", stdout);
39 #endif
40 n = read();
41 for (int i = 1; i <= n; i++) col[i] = read();
42 for (int i = 1; i < n; i++) {
43 a[i] = read(), b[i] = read();
44 E[a[i]].push_back(b[i]); E[b[i]].push_back(a[i]);
45 }
46 col[0] = col[1] ^ 1;
47 dfs(1, 0);
48 for (int i = 1; i <= n; i++) E[i].clear();
49 for (int i = 1; i < n; i++) {
50 int x = bl[a[i]], y = bl[b[i]];
51 if (x != y) E[x].push_back(y), E[y].push_back(x);
52 }
53 dfs1(1, 0);
54 int x = rt; rt = 0;
55 dfs1(x, 0);
56 printf("%d\n", d[rt] / 2);
57 return 0;
58 }
220726 T1 树染色问题 (树的直径)的更多相关文章
- B20J_2243_[SDOI2011]染色_树链剖分+线段树
B20J_2243_[SDOI2011]染色_树链剖分+线段树 一下午净调这题了,争取晚上多做几道. 题意: 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成 ...
- 线段树(区间树)之区间染色和4n推导过程
前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...
- ZOJ - 1610 经典线段树染色问题
这个是一个经典线段树染色问题,不过题目给的是左右左右坐标,即[0,3]包含0-1这一段 1-2这一段 2-3这一段,和传统的染色不太一样,不过其实也不用太着急. 我们把左边的坐标+1,即可,那么[0, ...
- 【BZOJ2243】[SDOI2011] 染色(树链剖分)
点此看题面 大致题意: 有一棵\(n\)个节点的无根树和\(m\)个操作,且每个节点有一个颜色.操作有两种:一种是将两点树上路径之间所有点染成颜色\(c\),另一种是询问两点树上路径之间颜色段的数量. ...
- 2243: [SDOI2011]染色 树链剖分+线段树染色
给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组 ...
- 浅谈算法和数据结构: 十 平衡查找树之B树
前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...
- B树、B+树的实现
B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1) 每个非根节点至少包含t-1个关键字,t个指向子节点的指针:至多包含2t-1个关键字,2t个指向子女的指针 ...
- 转 浅谈算法和数据结构: 十 平衡查找树之B树
前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为"在计算机科学中,B树(B-tre ...
- BZOJ 4337: BJOI2015 树的同构 树hash
4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...
- 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
随机推荐
- 老子云携手福昕鲲鹏,首次实现3D OFD三维版式文档的重大突破
你见过能动起来的文档吗? 这可不是动图,也不是视频,而是可以直接自由交互3D模型的3D OFD文档! OFD可能有人不熟悉,它其实是国产"PDF",3D OFD则突破了以往文字.图 ...
- Calendar类介绍_获取对象的方式和Calendar类的常用成员方式
java.util.Calendar是日历类,在Date后出现,替换掉了许多Date方法.该类将所有可能用到的时间信息封装为静态成员变量,方便获取.日历类就是方便获取各个时间属性的. Calendar ...
- mysql玩法
如何字段名查找所在的表名 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = '字段名字' select sys ...
- Javascript 构造函数、原型对象、实例之间的关系
# Javascript 构造函数.原型对象.实例之间的关系 # 创建对象的方式 # 1.new object() 缺点:创建多个对象困难 var hero = new Object(); // 空对 ...
- mosquitto使用的基本流程以及一些遇见的问题
改配置文件 以记事本的方式打开mosquitto.conf更改部分内容,找到# listener port-number [ip address/host name/unix socket path] ...
- ansible一键安装GreatSQL并构建MGR集群
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 利用ansible一键安装GreatSQL并完成MGR部署. 本次介绍如何利用ansible一键安装GreatSQL并完成 ...
- Luogu3435 [POI2006]OKR-Periods of Words (KMP)
\(next\)应用,将原串视作最长前缀复制后的子串 #include <iostream> #include <cstdio> #include <cstring> ...
- 深入理解Spring事件机制(一):广播器与监听器的初始化
前言 Spring 从 3.x 开始支持事件机制.在 Spring 的事件机制中,我们可以令一个事件类继承 ApplicationEvent 类,然后将实现了 ApplicationListener ...
- 从零开始实现一个MyBatis加解密插件
作者:vivo 互联网服务器团队- Li Gang 本篇文章介绍使用MyBatis插件来实现数据库字段加解密的过程. 一.需求背景 公司出于安全合规的考虑,需要对明文存储在数据库中的部分字段进行加密, ...
- 算法模板:C++的高精度
代码是抄别人的:https://blog.csdn.net/code4101/article/details/38705155. 这篇博客只是用来查看保存,非原创. #include<iostr ...