【XSY2505】tree
Description
机房断网了!xj轻而易举地撬开了中心机房的锁,拉着zwl走了进去。他们发现中心主机爆炸了。
中心主机爆炸后分裂成了 n 块碎片,但碎片仍然互相连接,形成一个树的结构。每个碎片有一个状态值0或1 。zwl找了一下规律,发现只有所有碎片的状态值相同的时候,主机才能够修复。
xj碰了碰其中一个碎片 x ,发现对于满足 x 到 v 的路径上所有碎片的状态值与 x 的状态值相同 的那些碎片 v 状态值都取反(0变1,1变0)了!
现在他们要尝试修复这个网络,最少需要多少次触碰呢?
Input
碎片从 1 到 n 编号。
第一行一个整数 n ,第二行 n 个数 0 或 1, 第 i 个数表示 i 号碎片的状态值。
接下来 n−1 行,每行两个数 x,y 表示 x 与 y 碎片中有连接。
Output
一行一个数,表示最少需要的碰撞次数。
Sample Input
11
0 0 0 1 1 0 1 0 0 1 1
1 2
1 3
2 4
2 5
5 6
5 7
3 8
3 9
3 10
9 11
Sample Output
2
HINT
样例解释:首先触碰三号碎片,再触碰六号碎片,这样所有碎片的状态值都会变为1 ,共触碰两次。
首先,他触碰的作用就是把一个以颜色相同为标准的连通块的颜色集体反转(下面的联通块的定义也是颜色相同)。
那我们可以将一个联通块缩成一个点。
正确答案就是缩点后的树的直径的一半(向上取整),\(d\)=树的直径,\(ans=[\frac{d+1}{2}]\)。
为什么是这一个数?
一棵黑白相间的树,想要把整棵树变成相同的颜色,最少也要\([\frac{d+1}{2}]\)次。
接下来,为什么这\([\frac{d+1}{2}]\)次一定可以被取到呢?
在这棵树的直径上,必然有一个点是满足距离其他所有点的距离不超过\([\frac{d+1}{2}]\),否则与树的直径为\(d\)矛盾,\([\frac{d+1}{2}]+[\frac{d+1}{2}]+1>d\)。
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
struct data
{
int s,n;
}bian[N];
int to[N],nxt[N],head[N],col[N],w[N],n,x,y,cnt,tot,nct,deep[N],maxn,nt,ntt;
void adde(int x,int y)
{
to[++cnt]=y;
nxt[cnt]=head[x];
head[x]=cnt;
}
void dfs(int u,int fa)//缩点
{
if(w[u]==w[fa]&&fa!=-1)
{
col[u]=col[fa];
}else{
col[u]=++tot;
bian[++nct].s=col[fa];
bian[nct].n=col[u];
}
for(int i=head[u];i;i=nxt[i])
{
int v=to[i];
if(v!=fa)
{
dfs(v,u);
}
}
}
void slove(int u,int fa)//求直径
{
for(int i=head[u];i;i=nxt[i])
{
int v=to[i];
if(v==fa)
{
continue;
}
deep[v]=deep[u]+1;
slove(v,u);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
adde(x,y);
adde(y,x);
}
dfs(1,-1);
memset(head,0,sizeof(head));
cnt=0;
for(int i=1;i<=nct;i++)
{
adde(bian[i].s,bian[i].n);
adde(bian[i].n,bian[i].s);
}
slove(1,-1);//开始求树的直径
maxn=-0x7f7f7f;
for(int i=1;i<=tot;i++)
{
if(deep[i]>maxn)
{
nt=i;
maxn=deep[i];
}
}
memset(deep,0,sizeof(deep));
slove(nt,-1);
maxn=-0x7f7f7f;
for(int i=1;i<=tot;i++)
{
if(deep[i]>maxn)
{
ntt=i;
maxn=deep[i];
}
}
printf("%d\n",(deep[ntt]+1)/2);
return 0;
}
【XSY2505】tree的更多相关文章
- 【POJ3237】Tree 树链剖分+线段树
[POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...
- 【BZOJ】【2631】Tree
LCT 又一道名字叫做Tree的题目…… 看到删边加边什么的……又是动态树问题……果断再次搬出LCT. 这题比起上道[3282]tree的难点在于需要像线段树维护区间那样,进行树上路径的权值修改&am ...
- 【Luogu1501】Tree(Link-Cut Tree)
[Luogu1501]Tree(Link-Cut Tree) 题面 洛谷 题解 \(LCT\)版子题 看到了顺手敲一下而已 注意一下,别乘爆了 #include<iostream> #in ...
- 【BZOJ3282】Tree (Link-Cut Tree)
[BZOJ3282]Tree (Link-Cut Tree) 题面 BZOJ权限题呀,良心luogu上有 题解 Link-Cut Tree班子提 最近因为NOIP考炸了 学科也炸了 时间显然没有 以后 ...
- 【AtCoder3611】Tree MST(点分治,最小生成树)
[AtCoder3611]Tree MST(点分治,最小生成树) 题面 AtCoder 洛谷 给定一棵\(n\)个节点的树,现有有一张完全图,两点\(x,y\)之间的边长为\(w[x]+w[y]+di ...
- 【HDU5909】Tree Cutting(FWT)
[HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...
- 【BZOJ2654】Tree(凸优化,最小生成树)
[BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...
- 【POJ1741】Tree(点分治)
[POJ1741]Tree(点分治) 题面 Vjudge 题目大意: 求树中距离小于\(K\)的点对的数量 题解 完全不觉得点分治了.. 简直\(GG\),更别说动态点分治了... 于是来复习一下. ...
- 点分治【bzoj1468】 Tree
点分治[bzoj1468] Tree Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边 ...
随机推荐
- 让视频丝滑流畅——N/A通用补帧傻瓜解决方案
补帧就是字面意思,把24帧的视频通过算法即时补偿到更高的帧数,获得更优秀的观感体验 索尼大法brivia电视的中高端产品线中的motionflow技术,都可以实现硬件补帧,只需要把动态打开,相应的画面 ...
- svg foreignObject的作用(文本换行,生成图片)
SVG内部利用foreignObject嵌入XHTML元素 <foreignObject>元素的作用是可以在其中使用具有其它XML命名空间的XML元素,换句话说借助<foreignO ...
- Scala 多继承问题
多继承问题: object LoadIssueDemo extends App { import java.io.PrintWriter trait Logger { def log(msg: Str ...
- Angular: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as ‘standalone’ in ngModelOptions.
在Angular中,动态生成的Html控件,如果没有name属性并且在ts中要操作Model的内容.就会引发如题的错误. 解决方案两个: 加上name的属性 设置ngModelOptions [n ...
- Spring Boot (十三): Spring Boot 整合 RabbitMQ
1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...
- vue常见问题随笔集
1.vuex操作对应关系 设置 触发/获取 action <-> dispatch mutations <-> commit getters <-> ...
- Kafka安装-Linux版
1. 准备 1.1 Kafka Kafka版本采用0.10.2.1,下载0.10.2.1文件 http://kafka.apache.org/downloads 1.2 JDK JDK ...
- Linux 命令之 chmod
命令格式 chmod有以下三种格式 chmod [-cfvR] MODE[,MODE]... FILE... chmod [-cfvR] OCTAL-MODE FILE... chmod [-cfvR ...
- 线程池和lambda表达式
线程池1.什么是线程池.一个用来创建和管理线程的容器;2.线程池的作用.提高线程的复用性,降低资源消耗提高线程的响应速度,提高线程的可管理性3.线程的核心思想;线程的复用 4.线程池的创建Execut ...
- RAID 10 配置流程
1.在虚拟机中再添加5块硬盘: 2.fdisk -l 可以查看当前虚拟机中的磁盘情况. 3.使用mdadm命令创建RAID10,名称为”/dev/md0″. -C代表创建操作,-v显示创建过程,-a ...