题目大意:

给定一棵有n个节点的树,有黑点白点两种节点.

每一次操作可以选择一个同种颜色的联通块将其染成同一种颜色

现在给定一个初始局面问最少多少步可以让树变为纯色.

题解:

首先我们拿到这棵树时先将其缩点

然后我们手中的树就变成了一棵黑白相间的黑白树.

那么我们现在就是每次选择一个节点使其变色,都会使得这个节点相邻的所有节点合并进来.

所以我们找度数最大的合并就好了啊

我们现在把这棵树想象成由若干条路径组成的.

那么我们每次合并都会使某些路径的长度最多减少2

所以我们可以自然而然地想到一定是树的直径花费的操作次数最大.

所以我们将一棵树化作一条链上面连着许多其他的分支的形式.

手模几个样例就话发现答案实际上是\([\frac{len+1}{2}]\)len为直径长度.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 200010;
int belong[maxn],nodecnt;
int col[maxn];
struct Graph{
struct Edge{
int to,next;
}G[maxn<<1];
int head[maxn],cnt;
void add(int u,int v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
#define v G[i].to
void dfs1(int u,int f){
if(col[u] != col[f]) belong[u] = ++ nodecnt;
else belong[u] = belong[f];
for(int i = head[u];i;i=G[i].next){
if(v == f) continue;
dfs1(v,u);
}return ;
}
int dis[maxn],p;
void dfs2(int u,int f){
for(int i = head[u];i;i=G[i].next){
if(v == f) continue;
dis[v] = dis[u] + 1;
dfs2(v,u);
}
if(dis[p] < dis[u]) p = u;
}
#undef v
}g1,g2;
int main(){
int n;read(n);
for(int i=1;i<=n;++i) read(col[i]);
for(int i=1,u,v;i<n;++i){
read(u);read(v);
g1.add(u,v);g1.add(v,u);
}belong[1] = ++ nodecnt;
g1.dfs1(1,1);
for(int u=1;u<=n;++u){
for(int i = g1.head[u];i;i=g1.G[i].next){
if(belong[g1.G[i].to] != belong[u]){
g2.add(belong[u],belong[g1.G[i].to]);
}
}
}
g2.dfs2(1,1);
int u = g2.p;
memset(g2.dis,0,sizeof g2.dis);
g2.dfs2(u,u);
int ans = (g2.dis[g2.p] + 1)/2;
printf("%d\n",ans);
return 0;
}

最新文章

  1. [bzoj2653][middle] (二分 + 主席树)
  2. 基于C#语言利用Microsoft.office.introp.excel操作Excel总结
  3. centos 使用pip安装mysql-python
  4. &lt;&lt;编写可维护的JavaScript&gt;&gt;之避免使用全局变量
  5. Cocos2dx 3.0 过渡篇(二十九)globalZOrder()与localZOrder()
  6. cocos2dx libjson
  7. C#_uploadify_mvc_version
  8. 实现类似QQ的即时通信程序(十一)
  9. Java线程状态:BLOCKED与WAITING的区别
  10. Reactor模型
  11. LVM pvcreate,vgcreate,lvcreate,mkfs
  12. AOP中的ASPECTJ
  13. 企业级分布式监控系统-Zabbix基础
  14. Failed to create the XA control connection. Error: &quot;找不到存储过程 &#39;master..xp_sqljdbc_xa_init_ex&#39;。
  15. Android 开发 MaterialDialog框架的详解
  16. UILabel设置富文本后不显示省略号
  17. 常用jquery
  18. java随笔5 完整路径的应用
  19. printf、fprintf、sprintf和snprintf 区别
  20. AD采样模块采集带模拟量真空表值的实验

热门文章

  1. Pollard-Rho大整数拆分模板
  2. 石子合并DP
  3. 深度问答之提取语料,导入了yml模块
  4. 如何写PHP规范注释
  5. Android SDK上手指南 2:用户界面设计
  6. c++ 之重要性
  7. 关于tomcate跨域配置的配置问题和表头加入新属性的过滤
  8. C#判断VS是否处于设计模式
  9. PHP 邮件发送类
  10. 20145229吴姗珊 《Java程序设计》第8周学习总结