codeforces734E
题目连接:http://codeforces.com/contest/734/problem/E
3 seconds
256 megabytes
standard input
standard output
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 such that all vertices have the same color (black or white).
To change the colors Anton can use only operations of one type. We denote it as paint(v), where v is some vertex of the tree. This operation changes the color of all vertices u such that all vertices on the shortest path from v to u have the same color (including v and u). For example, consider the tree

and apply operation paint(3) to get the following:

Anton is interested in the minimum number of operation he needs to perform in order to make the colors of all vertices equal.
The first line of the input contains a single integer n (1 ≤ n ≤ 200 000) — the number of vertices in the tree.
The second line contains n integers colori (0 ≤ colori ≤ 1) — colors of the vertices. colori = 0 means that the i-th vertex is initially painted white, while colori = 1 means it's initially painted black.
Then follow n - 1 line, each of them contains a pair of integers ui and vi (1 ≤ ui, vi ≤ n, ui ≠ vi) — indices of vertices connected by the corresponding edge. It's guaranteed that all pairs (ui, vi) are distinct, i.e. there are no multiple edges.
Print one integer — the minimum number of operations Anton has to apply in order to make all vertices of the tree black or all vertices of the tree white.
题目大意:有一棵树,有黑白两种颜色,每个节点为黑色或白色,每次变换使得相连的同色节点全部变成另一种颜色,求使树变成单色(纯黑或纯白)所需的最少操作数。
解题思路:
刚开始忽略了改变颜色后连同块的大小会改变,用并查集做了,结果当然WA,后来想到会改变,所以用dfs。
第一次dfs缩点,把连通块缩为一点,构成一个新图,方便处理。
缩点完成后的图就变成了黑白交替出现的一棵树,改变一个节点就相当于把它和与他直接相连的所有节点缩为一点,最后的结果为该树的最长路径/2。
写一下自己想的弱鸡证明过程;
1.首先证明,操作次数只与最长路径有关。
假设有一棵树(称之为完全树),在它的最长路径上的所有节点都连有在保证该路径是最长路径的前提下可连的最多节点,显然,此种情况下操作次数不会大于只有最长路的操作次数,因为必须保证最长链完成修改。另外显然,经过缩点得到的所有可能的树的操作次数小于等于完全树,所以可得,操作次数只与最长路径有关。
2.证明结果为最长路径的1/2。
只考虑其最长路径,假设最长路径节点数n为奇数,则相当于每次操作减少两节点,直至最后剩下一个节点,设操作数为x,则有:n-2x=1,解得x=(n-1)/2;
假设n为偶数,则最后一次操作相当于只消除一个节点,则有n-2(x-1)-1=1,解得 =n/2
综合可得,x=n/2(整数除法)
代码如下:
#include<bits/stdc++.h>
using namespace std;
vector <],g[];
];
]={};
,maxp;
void dfs1(int n,int s)
{
if(n>N||vis[n])
return;
vis[n]=;
if(c[n]!=c[s])
{
g[n].push_back(s);
g[s].push_back(n);
s=n;
}
;i<G[n].size();i++)
{
dfs1(G[n][i],s);
}
}
void dfs2(int n,int dis)
{
if(vis[n])
return;
vis[n]=;
if(dis>maxx)
{
maxx=dis;
maxp=n;
}
;i<g[n].size();i++)
dfs2(g[n][i],dis+);
}
int main()
{
int x,y;
cin>>N;
;i<=N;i++)
scanf("%d",&c[i]);
;i<N;i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs1(,);
memset(vis,,sizeof(vis));
dfs2(,);
memset(vis,,sizeof(vis));
dfs2(maxp,);
cout<<maxx/<<endl;
}
codeforces734E的更多相关文章
- CodeForces-734E Anton and Tree 树的直径
题目大意: 给定一棵有n个节点的树,有黑点白点两种节点. 每一次操作可以选择一个同种颜色的联通块将其染成同一种颜色 现在给定一个初始局面问最少多少步可以让树变为纯色. 题解: 首先我们拿到这棵树时先将 ...
随机推荐
- log4net将日志写入ElasticSearch
log4net将日志写入ElasticSearch https://www.cnblogs.com/huangxincheng/p/9120028.html 很多小步快跑的公司,开发人员多则3-4个, ...
- 【BZOJ 3505】 [Cqoi2014]数三角形 容斥原理+排列组合+GCD
我们先把所有三角形用排列组合算出来,再把一行一列上的三点共线减去,然后我们只观察向右上的三点共线,向左上的乘二即可,我们发现我们如果枚举所有的两边点再乘中间点的个数(GCD),那么我们发现所有的两边点 ...
- TCP ------ TCP创建服务器中出现的套接字
在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求.这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回 ...
- JSON.parse() 和 JSON.stringify()使用
1.parse()是用于从一个字符串中解析出json对象 定义一个字符串:var str = '{"name":"superman","age&quo ...
- lesson 1
1.当前只是开始接触,安装并开始熟悉Visual Studio 的操作界面及基本设置 2.学习了新建项目,简单的hello world,及对颜色的更改.
- 动态规划:高维DP
例子当然是王八棋这道题,这道题以前是写烂了 先来一个大暴力,zlw教的暴力~~ #include<iostream> using namespace std; ,maxm=; ]; int ...
- BZOJ 4514: [Sdoi2016]数字配对
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1606 Solved: 608[Submit][Statu ...
- 【洛谷 P3846】 [TJOI2007]可爱的质数 (BSGS)
题目链接 \(BSGS\)模板题..不会点这里 #include <cstdio> #include <cmath> #include <map> using na ...
- 列出top中的pid
#!/usr/bin/env python import os import string #方法1:通过字符串的isdigits来判断 #filelist = os.listdir('/proc') ...
- C++高精度
整理了一下高精度,虽然可用java,但很多时候还是C++写的方便. 附上kuangbin神的高精度模板(HDU1134 求卡特兰数) #include <iostream> #includ ...