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 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
随机推荐
- range函数的使用
循环结构终于会出现了 这章讲完差不多读者可以实现大部分程序了 range()函数 用于生成一个整数序列 内置函数:前面不需要加任何前缀,可以直接使用的函数 创建range对象的三种方式 range(s ...
- java------JRE和JDK
JDK(Java Development kit):Java开发工具包 包括 JVM(Java Virtual Machine):java虚拟机,真正运行java程序的地方(Java语言在运行时并不是 ...
- SpringBoot使用CORS的addCorsMappings中会遇到的问题
跨域需要后端需要设置响应的跨域头 如下 public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/ ...
- HelloWorld入门程序
程序开发步骤说明 开发环境搭建完成后我们就可以开发第一个java程序了 java程序开发三步骤:编写.编译.运行 编写Java源程序 1.在本地盘目录下新建文本文件,完整的文件名修改为HelloWor ...
- 2550--HashMap源码解析
JDK版本 1.8 结构: HashMap实现了Map Cloneable Serializable接口: 基础了AbstractMap类,AbstractMap提供一些通用方法,如put remov ...
- vscode 个人配置 settings.json
{ "workbench.colorTheme": "Default Dark+", "workbench.iconTheme&quo ...
- linux 安装Apache php mysql注意事项
由于apache的php组件 php.so是由php安装生成的,故需在Apache安装之后才安装php比较合适 libphp5.so是php5提供的,你还需要编译php5才能生成这个文件 你在PHP的 ...
- java学习第七天lo流.day17
lo输入
- Redis安装及常用配置
Redis安装说明 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包.因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本 ...
- Word 文字错乱,接收方显示的字体与原版不一直
原版文档使用字体的不是电脑上自带的常规字体,比如,黑软雅黑.黑体.宋体等字体.当把文档发送给其他人查阅时,字体发生了错乱,也就是字体与原版字体不一致. 需要打开"选项"设置,把非常 ...