CodeForces-734E Anton and Tree 树的直径
题目大意:
给定一棵有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;
}
												
											CodeForces-734E Anton and Tree 树的直径的更多相关文章
- Codeforces 734E Anton and Tree(缩点+树的直径)
		
题目链接: Anton and Tree 题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字 ...
 - Codeforces Round #379 (Div. 2) E. Anton and Tree 树的直径
		
E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...
 - Codeforces 734E. Anton and Tree 搜索
		
E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...
 - Codeforces 379F New Year Tree  树的直径的性质推理
		
New Year Tree 我们假设当前的直径两端为A, B, 那么现在加入v的两个儿子x, y. 求直径的话我们可以第一次dfs找到最远点这个点必定为直径上的点, 然而用这个点第二次dfs找到最远点 ...
 - CodeForces 734E Anton and Tree
		
$dfs$缩点,树形$dp$. 首先将连通块缩点,缩点后形成一个黑白节点相间的树.接下来的任务就是寻找一个$root$,使这棵树以$root$为根,树的高度是最小的(也就是一层一层染色).树形$dp$ ...
 - Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径
		
E. Anton and Tree 题目连接: http://codeforces.com/contest/734/problem/E Description Anton is growing a t ...
 - LightOJ1094 - Farthest Nodes in a Tree(树的直径)
		
http://lightoj.com/volume_showproblem.php?problem=1094 Given a tree (a connected graph with no cycle ...
 - 【bzoj2870】最长道路tree  树的直径+并查集
		
题目描述 给定一棵N个点的树,求树上一条链使得链的长度乘链上所有点中的最小权值所得的积最大. 其中链长度定义为链上点的个数. 输入 第一行N 第二行N个数分别表示1~N的点权v[i] 接下来N-1行每 ...
 - codeforces 14D(搜索+求树的直径模板)
		
D. Two Paths time limit per test 2 seconds memory limit per test 64 megabytes input standard input o ...
 
随机推荐
- iOS Sprite Kit教程之编敲代码以及Xcode的介绍
			
iOS Sprite Kit教程之编敲代码以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由非常多的文件组成,比如代码文件.资源文件等.Xcode会帮助开发人员对这些文件进行管理.所以,X ...
 - vim对光标所在的数字进行增减
			
真是vim会在不经意间给你惊喜...... 现在发现把光标移到某数字的上方,c-a是加1, c-x是减1 当时真有点众里寻他千百度的感觉
 - python脚本分析nginx访问日志
			
日志格式如下: 223.74.135.248 [11/May/2017:11:19:47 +0800] "POST /login/getValidateCode HTTP/1.1" ...
 - 经典的css reset代码 (reset.css)
			
<style> html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...
 - 页游手游服务器(二)c支持mysql
			
上一篇说的是liua的net拓展,这一篇说lua的sql拓展,准确说是mysql拓展,这里推荐下postgre,比mysql好用,支持数组,各种好,不过腾讯平台不支持,所以你的公司要和腾讯合作,掂量下 ...
 - JS一些碎知识点
			
一些js基本知识点 Doctype 浏览器渲染模式 渲染模式发展历史 在多年以前(IE6诞生以前),各浏览器都处于各自比较封闭的发展中(基本没有兼容性可谈).随着WEB的发展,兼容性问题的解决越来越显 ...
 - STM32 HAL SPI读取MPU6500的设备ID异常
			
1.问题背景 近前,使用STM32F4 HAL库的SPI读取MPU6500出现异常. 现象:读取ID失败,返回0,以为硬件焊接问题,各种排查,最后为了示波器测试方便,把读取ID的函数放到While(1 ...
 - SDUT 1048 Digital Roots
			
Digital Roots Time Limit: 1000ms Memory limit: 65536K 题目描述 The digital root of a positive integer ...
 - scikit-learn笔记之初次接触
			
一.加载数据: 然后看一下有多少个特征和类别以及它们的名字: 二.数据可视化:: 由于该套数据集有4个特征,所以只能选取2个特征进行显示. 可见红色和绿色的点混在一起,所以再选择其他特征作为坐标轴: ...
 - Linux上网设置
			
ifconfig 命令查看网络设置 步骤1.配置/etc/sysconfig/network-scripts/ifcfg-eth0 里的文件.有的是(ifcfg-ens33) 文件 CentOS下的i ...