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 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
随机推荐
- C#Lambda表达式演变和Linq的深度解析
Lambda 一.Lambda的演变 Lambda的演变,从下面的类中可以看出,.Net Framwork1.0时还是用方法实例化委托的,2.0的时候出现了匿名方法,3.0的时候出现了Lambda. ...
- python base64编码和解码图片
简介 在实际项目中,可能需要对图片进行大小的压缩,较为常见的方法则是将图片转换为base64的编码,本文就python编码和解码图片做出一定的介绍. 代码 import base64 import o ...
- CMake库搜索函数居然不搜索LD_LIBRARY_PATH
摘要: 本文通过编译后运行找不到库文件的问题引入,首先分析了find_package(JNI)的工作流程,而后针对cmake不搜索LD_LIBRARY_PATH的问题,提出了一种通用的解决办法. 本文 ...
- JS中的数据类型及转换
js的六大类型 js中有六种数据类型,Boolean: 布尔类型 Number:数字(整数int,浮点数float ) String:字符串 Object:对象 (包含Array数组 ) 特殊数据类型 ...
- 用JavaScript写输入框的校验
//Script function cheack(){ var kong = ''//获取值不能放外面,不然一直为空 kong = document.getElementById('name').va ...
- 【原创】Python 极验滑块验证
本文仅供学习交流使用,如侵立删! 记一次 极验滑块验证分析并通过 操作环境 win10 . mac Python3.9 selenium.seleniumwire 分析 最近在做的一个项目登录时会触发 ...
- 获取Windows正在运行的窗口进程
主要是获取Alt+Tab中展示的窗口 原理主要是获取窗口的样式来判断是否会在Alt+Tab中显示 具体代码如下 /// <summary> /// Alt+Tab 应用 /// </ ...
- ubuntu下安装python
一.安装python3.6 sudo add-apt-repository ppa:jonathonf/python-3.6 如显示不能添加"'ppa:~jonathonf/ubuntu/p ...
- 在安装Windows时手动创建分区
目前硬件都已经支持UEFI模式启动了,而且硬盘容量普遍大于MBR磁盘能支持的最大2TB的容量.所以在安装Windows系统的时候优先选用UEFI启用,并将磁盘配置为GPT模式以支持更大的容量.而且Wi ...
- 5、Math类
Math类 Math类包含用于执行基本数学运算的方法,如初等数学,对数,平方根和三角函数 常用方法 //Math 常用方法(静态方法) //1.abs 绝对值 int abs = Math.abs(- ...