题目描述

高钧在校园中漫步时,经过了一棵树。这时,几个同学突然冒出来控制住了他。

这棵树有 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 树染色问题 (树的直径)的更多相关文章

  1. B20J_2243_[SDOI2011]染色_树链剖分+线段树

    B20J_2243_[SDOI2011]染色_树链剖分+线段树 一下午净调这题了,争取晚上多做几道. 题意: 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成 ...

  2. 线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

  3. ZOJ - 1610 经典线段树染色问题

    这个是一个经典线段树染色问题,不过题目给的是左右左右坐标,即[0,3]包含0-1这一段 1-2这一段 2-3这一段,和传统的染色不太一样,不过其实也不用太着急. 我们把左边的坐标+1,即可,那么[0, ...

  4. 【BZOJ2243】[SDOI2011] 染色(树链剖分)

    点此看题面 大致题意: 有一棵\(n\)个节点的无根树和\(m\)个操作,且每个节点有一个颜色.操作有两种:一种是将两点树上路径之间所有点染成颜色\(c\),另一种是询问两点树上路径之间颜色段的数量. ...

  5. 2243: [SDOI2011]染色 树链剖分+线段树染色

    给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组 ...

  6. 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...

  7. B树、B+树的实现

    B树的定义 假设B树的度为t(t>=2),则B树满足如下要求:(参考算法导论) (1)  每个非根节点至少包含t-1个关键字,t个指向子节点的指针:至多包含2t-1个关键字,2t个指向子女的指针 ...

  8. 转 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为"在计算机科学中,B树(B-tre ...

  9. BZOJ 4337: BJOI2015 树的同构 树hash

    4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...

  10. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

随机推荐

  1. SkiaSharp 之 WPF 自绘 拖曳小球(案例版)

    感谢各位大佬和粉丝的厚爱和关心( 催更),我会再接再厉的,其实这也是督促自己的一种方式,非常感谢. 刚写了一篇万字长文,自己也休养生息(低调发育)了一段时间,接下来来几个小案例. 拖曳小球 WPF的拖 ...

  2. 自定义bean对象实现序列化接口

    上一个word count的案例中,我们为了理解mapreduce的流程,写了上面的代码.现在我们要把一个实体类序列化.比如现在有这么一个文件,里面的数据格式是这样的: 第一列是时间戳,第二列是手机号 ...

  3. LitJson报错记录

    1.float转double报错 报错类型: Max allowed object depth reached while trying to export from type System.Coll ...

  4. 活动回顾|Apache DolphinScheduler x Pulsar 在线 Meetup

    关于 Apache DolphinScheduler: " Apache DolphinScheduler(Incubating) 是一个分布式去中心化.易扩展的可视化工作流任务调度系统,致 ...

  5. WebGPU的计算着色器实现冒泡排序

    大家好~本文使用WebGPU的计算着色器,实现了奇偶排序. 奇偶排序是冒泡排序的并行版本,在1996年由J Kornerup提出.它解除了每轮冒泡间的串行依赖以及每轮冒泡内部的串行依赖,使得冒泡操作可 ...

  6. [C#]使用 AltCover 获得代码覆盖率 - E2E Test 和 Unit Test

    背景 在 CI/CD 流程当中,测试是 CI 中很重要的部分.跟开发人员关系最大的就是单元测试,单元测试编写完成之后,我们可以使用 IDE 或者 dot cover 等工具获得单元测试对于业务代码的覆 ...

  7. CF383C Propagating tree (线段树,欧拉序)

    \(tag\)没开够\(WA\)了一发... 求出\(dfs\)序,然后按深度分类更新与查询. #include <iostream> #include <cstdio> #i ...

  8. Spring源码 12 IOC refresh方法7

    本文章基于 Spring 5.3.15 Spring IOC 的核心是 AbstractApplicationContext 的 refresh 方法. 其中一共有 13 个主要方法,这里分析第 7 ...

  9. 60行自己动手写LockSupport是什么体验?

    60行自己动手写LockSupport是什么体验? 前言 在JDK当中给我们提供的各种并发工具当中,比如ReentrantLock等等工具的内部实现,经常会使用到一个工具,这个工具就是LockSupp ...

  10. React报错之React Hook useEffect has a missing dependency

    正文从这开始~ 总览 当useEffect钩子使用了一个我们没有包含在其依赖数组中的变量或函数时,会产生"React Hook useEffect has a missing depende ...