CodeForces734E - Anton and Tree(缩点+树的直径)

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办 IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。 阅读详情

题目链接:

http://codeforces.com/problemset/problem/734/E


题目大意:

给定一棵无根数,每个节点有黑白两种颜色,现在有一种涂色操作,一次可以将一块连通的同色区域涂为一个颜色,现在求最少操作几次可以将整棵树涂成黑色或白色。


解题过程:

因为之前做过一个涂板子的题,进行的操作和这个一样,也是先缩点。不过那个数据范围比较小,枚举所有点BFS一次,求最长路即可,但是做过数据范围比较大,所以用到了树的某些性质。


题目分析:

关于树的直径的介绍和BFS的求法,建议看这篇博客,也有详细证明。

如果之前做过这道题的话,那么这个题的思路不难想,就是缩点然后再求一下树的直径就好了。

树的直径有一个性质,以树的直径中点上的一点为根,将这颗无根树转化为有根树的话,这样做会使树的深度最小,且为树的直径的一半(向上取整),因为如果有一个叶子节点比直径更深的话,那么就可以构成一个更长的直径,与假设矛盾。

另外在树上缩点,构成的新的图也是一棵树。


AC代码:

#include <bits/stdc++.h>
using namespace std;

const int MAX = 212345;

int color[MAX], n, vis[MAX], top;
vector<int> raw_edge[MAX], edge[MAX];

//用DFS染色缩点
void dfs(int u) {
    vis[u] = top;
    for (int i = 0; i < raw_edge[u].size(); i++) {
        int v = raw_edge[u][i];
        if (!vis[v] && color[u] == color[v]) {
            //如果颜色相同,并且没访问过那么缩成一个点
            dfs(v);
        }
        else if (vis[v] && color[u] != color[v]){
            //如果颜色不同,并且访问过,那么就建边
            edge[top].push_back(vis[v]);
            edge[vis[v]].push_back(top);
        }
    }
}

void build() {
    top = 1;
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            dfs(i);
            top++;
        }
    }
}

//BFS求最长路
int bfs(int u) {
    memset(vis, 0, sizeof(vis));
    queue<int> q;
    q.push(u);
    vis[u] = 1;
    while (!q.empty()) {
        u = q.front();
        q.pop();
        for (int i = 0; i < edge[u].size(); i++) {
            int v = edge[u][i];
            if (!vis[v]) {
                vis[v] = vis[u] + 1;
                q.push(v);
            }
        }
    }
    int pos = 1;
    for (int i = 1; i < top; i++) {
        if (vis[i] > vis[pos])
            pos = i;
    }
    return pos;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> color[i];
    }
    for (int i = 0; i < n-1; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        raw_edge[u].push_back(v);
        raw_edge[v].push_back(u);
    }
    build();
    //先确定直径的一个端点
    int x = bfs(1);
    //然后从端点跑最长路求出直径长度,这里距离求出来的是比实际距离大1,所以默认向上取整
    printf("%d\n", vis[bfs(x)]/2);
}
WPF用户控件间属性传递的艺术 本文详细介绍了WPF中父控件向子控件传递属性的方法。针对常见的绑定失效问题,重点讲解了使用RelativeSource绑定技术,通过指定AncestorType确保正确访问父控件属性。文章通过实例演示了从ParentModel传递属性到ChildUserControl依赖属性的完整实现过程,包括模型定义、XAML结构设计和代码实现。这种方法有效解决了数据上下文混淆问题,为WPF开发中的控件交互提供了可靠解决方案,有助于提升应用的灵活性和可维护性。 阅读详情

相关推荐

ArcGIS 10.8软件安装包免费下载及安装教程

ArcGIS 10.8安装教程

qq_44894692的博客 2万+

【CF734E】Anton and Tree【树的直径】

一开始理解错题意了,直接暴力判断连通块个数,我就说怎么这么简单。。。其实这个颜色的连通块是会动态变化的,染色之后可能会有合并连通块的发生。问题好像瞬间复杂了起来。但是在染色的时候连通块一定会一起被染色,于是就相当于一个点了,我们也用DFS去缩成一个点,不难发现,新的一棵树上,都是黑白点交替出现的。想到这里可能觉得跟树的深度有关,但是换根深度也会变化。实际上答案就是(树的直径+1)/2,从直径的中点开始染色就行,只要想到直径方案是显然的。

ssllyr 231

STM32F103新手必看:0.96寸OLED屏幕从接线到动态显示全攻略(附IIC避坑指南)

本文为STM32F103新手提供了0.96寸OLED屏幕从硬件接线到软件驱动的完整实战指南。重点解析了IIC通信的时序、设备地址(0x78/0x7A)的常见陷阱,并详细演示了如何实现字符显示与平滑滚动显示等动态效果,帮助开发者快速上手并避开常见调试难题。

stone的博客 552

Codeforces 734E Anton and Tree(并查集+树的直径)

传送门 题意:给一棵黑白染色过的树,每次操作可以将一块连通的同色子图(连通块内不含另一颜色)染成另一颜色,问最小需要操作几次才能将树上所有节点统一为同一颜色。 题解:先用并查集缩点,把同一颜色的连通的缩成一个点,得到新树,然后直径上的点数/2即可。(从直径中间那个点开始染色,把同色的区间不断往直径两端扩展,这个过程中非直径上的点的颜色也会被统一) 脑洞还是不够大....树的直径又没看出来诶 #include<cstdio> #include<cstring> #includ

KGV093的博客 274

黑金AXU9EG开发板深度学习部署全流程解析

本文详细解析了黑金AXU9EG开发板的深度学习模型部署全流程,从环境搭建、模型转换到上板验证,提供了实用的技术指导和优化技巧。该开发板基于Xilinx Zynq UltraScale+ MPSoC架构,特别适合边缘计算场景,通过FPGA加速实现高效AI推理。

weixin_29062613的博客 447

【maxENT】从数据到地图:R语言实现最大熵物种分布建模全流程解析

本文详细解析了如何使用R语言实现最大熵模型(MaxEnt)进行物种分布建模的全流程。从数据准备、环境变量处理到模型训练与参数调优,再到模型评估与结果可视化,提供了实用的代码示例和避坑指南。特别适合生态学研究者利用最大熵模型处理物种分布数据,提升研究效率。

weixin_27244795的博客 216

CodeForces 734 E.Anton and Tree

E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes Anton is growing a tree in his garden. In case you forgot, the tree is a connected acyclic undirected graph. The...

nan 388

2006NOIP普及组真题 4. 数列

从上述推理中,我们发现要输出的幂次和中的第 N 项(也就是幂次和中的序号N),对应的二进制位数和幂次和对应的二进制位数相同。当 k=3 时,k的幂次为1, 3, 9, 27, 81…,即第0位,第2位均为1,转成 k 进制(k=3)时。,即第2位,第3位均为1,转成 k 进制(k=3)时。转成 k 进制(k=3)时的幂次和为。,即第0位,第1位,第2位均为1,(即第0位,第1位,第2位均为1)N=12时,12的二进制是。(即第0位,第2位均为1)(即第2位,第3位均为1)结论:这道题就变成了。

weixin_40252159的博客 1514

codeforces 734 E. Anton and Tree(连通分量缩点+树的直径)

题目链接:http://codeforces.com/contest/734/problem/E思路:先缩点,变成黑白相间的一棵树,然后找出树的直径d,每改变一个节点的颜色,相当于将一整块变成一个新的连通分量,画张图可以看出来,答案就是(d+1)/2;#include &lt;cstdio&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; ...

llmxby 277

多核系统核间通信(IPC)设计:从硬件机制到软件实现

在多核处理器与嵌入式系统设计中,核间通信(IPC)是实现计算资源协同工作的核心技术。其原理基于共享内存、硬件邮箱与中断等底层硬件机制,通过构建结构化的消息传递通道,实现核间高效、可靠的数据交换。该技术的核心价值在于打破多核间的壁垒,将分散的计算单元整合为有机整体,从而显著提升系统整体性能与响应能力。在工程实践中,IPC广泛应用于智能座舱、边缘AI网关、实时控制系统等场景,用于处理如仪表显示、AI推理、实时控制等复杂任务。本文聚焦于基于共享内存与VRING的消息队列实现,深入剖析缓存一致性、内存屏障等关键问题

weixin_27006759的博客 594

海思3403烧结、复用及mic输入

3403调试的第一步是版本烧结,版本烧结经常遇到问题,本文记录总结遇到的各种问题。

平面到立体 1354

Codeforces 734E Anton and Tree(缩点+树的直径)

题目链接:Anton and Tree 题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字的一棵数。 题解:首先一次可以改变一片数字,那么进行缩点后就变成了每次改变一个点。缩完点后这棵数变成了一棵相邻节点不同,0和1相交叉的一棵树。然后一棵树的直径上就是 0 1 0 1...

160

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(配置映射是因为用户只能通过 http 请求访问到服务器,不能直接访问到对应的容器,因此需要服务器端口与容器端口建立映射关系)这里我们有两种启动 redis 的方式,第一种是直接启动 redis ,第二种是以 AOF 持久化的方式启动容器(--appendonly yes),如下图。如果需要持续查看日志信息可以添加 -f 参数,例如:docker logs -f mn ,这里 mn 是自定义容器名称, ctrl + c 可以停止跟踪。

CYK_byte的博客 1万+

CodeForces 734E-Anton and Tree(并查集缩点+树的直径)

题目链接:https://codeforces.com/problemset/problem/734/E 博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13417220.html Anton is growing a tree in his garden. In case you forgot, the tree is a connected acyclic undirected graph. There are n vertices in the tree,

孤风的博客 560

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Codeforces 734E Anton and Tree (dfs缩点+树的直径)

E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Anton is growing a tree in his garden. In case yo

K键盘里的青春K 843

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Codeforces 734E. Anton and Tree By Assassin 缩点+树的最大直径

题意就不多加赘述了,说白了就是每一次可以反转任意连通块儿,这个连通块儿必须满足相连且花色相同,问你最少的反转次数。思路:一看题目思路其实很清楚了,我们为了缩小数据规模,利用缩点将一个连同块儿化成一个点,之后我们一定可以得到一个树,因为原题就是一个树,之后我们只需要找到树的最大直径就行了。 步骤1:缩点 步骤2:求树的最大直径(其实就是两次搜索,因为第一次从任意点出发找到最远的一个点,那么这个点一

Assassin 466

Codeforces 734E Anton and Tree【并查集缩点||DFS缩点+树的直径】

E. Anton and Tree Anton is growinga tree in his garden. In case you forgot, the tree is a connected acyclicundirected graph. There aren vertices in the tree, each of them is painted black or white. Antondoesn't like multicolored trees, so he wants to chang

Dust_heart的博客 615

Codeforces 734E Anton and Tree【并查集缩点+树的直径】好题~

E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Anton is growing a tree in his garden. In case you

mengxiang000000 595

D - Anton and Tree CodeForces - 734E(dfs 缩点+树的直径)

题意 给我一颗有 n 个节点的树,树的编号从 1~n 开始,树的节点有点权,值为 0 的表示节点被染成了 白色,权值为的时候被染成了黑色, 现在我们的给我们提供一种操作(如下图):选择某一个结点 x,让把所有把 x 能直接有路径到达的点设这些点为 y,且 y 与 x 同色,把 x 与所有 y 的颜色进行翻转。 思路 把相邻且颜色相同的点认为是在一个连通分量里面,这个时候如果我们选择一个连通分量对其进行翻转,那么翻转之后这个连通分量与周围的连通分量的颜色变的相同,相当于同化了周围的连通分量,接下来我们

做一只熊猫不好吗? 174

Codeforces-734E Anton and Tree(树的直径)

E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Anton is growing a tree in his garden. In

十分残念的博客 498

CodeForces - 734E Anton and Tree

博主的 BiBi 时间 博主还有 1h+11min\mathtt{1h+11min}1h+11min 就ヾノ≧∀≦)o 放假啦!好鸡冻!!! 然鹅博主这个小蒟蒻在假期还有作业,但是和平时比较假期作业显得极其划算。hihihihihihihi~ Solution 感觉这题非常巧。 我们将同色的连通块缩成一个点,然后就有一个非常神奇的性质:ansansans 就是 ⌊新树的直径+12⌋\lfloor \frac{新树的直径+1}{2} \rfloor⌊2新树的直径+1​⌋。 你可能觉得答案应该是 min⁡(黑点

Oxide‘s Blog 297

[codeforces 734E]Anton and Tree

【题目大意】 给一棵n( 【解题思路】 先将相同颜色的连通块缩点,然后我们就得到了一棵黑白相间的树。 我们可以发现当确定一个点为根时的最少操作数为树的高度减一。 当以树的直径的中点为根时树的高度最小。 因此答案为(树的直径长度+1)/2。 用dp或者两次dfs求出树的直径。 【呆马】 #include #include #inclu

S_G_G的博客 580

Codeforces 734E. Anton and Tree (联通块 + 树的直径)

Description Anton is growing a tree in his garden. In case you forgot, the tree is a connected acyclic undirected graph. There are n vertices in the tree, each of them is painted black or white. Anton doesn’t like multicolored trees, so he wants to change

chr1stopher 304

Anton and Tree CodeForces - 734E(树的直径)

Anton is growing a tree in his garden. In case you forgot, the tree is a connected acyclic undirected graph. There are n vertices in the tree, each of them is painted black or white. Anton doesn’t like multicolored trees, so he wants to change the tree suc

tomjobs的博客 411

codeforces - 734E - Anton and Tree(图论 树)

codeforces - 734E - Anton and Tree(图论 树)LINK:http://codeforces.com/contest/734/problem/E题意: 给一棵树,点被染成了黑白二色,每次操作可以翻转相邻的同色点的颜色,问最少多少次操作能把整棵树染成一个颜色。解法: 当天没去看..被剧透了,帮人把结论证明了一遍:把相邻同色的点缩点之后树的直径的一半就是答案。 对每

horihori_的博客 833

【codeforces 734E】Anton and Tree【缩点+DP】

题目链接:codeforces 734E题目大意:来看题解的都是知道题目是什么意思的,我就不多嘴了。题解cf自题解已经非常清楚了。先缩点,再找出该树一条最长的直径d,答案就是(d+1)/2 为什么呐?? 假设树的直径是0,那么答案就是0吧。然后我们就可以看到这个事实: the tree diameter can’t be decreased more than by two per one pa

cyclization的小栈 408
上一篇: HackerRank - pairs-again(暴力+预处理)
下一篇: CodeForces743D - Chloe and pleasant prizes(树型DP)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值