Anton and Tree

题目链接:http://codeforces.com/contest/734/problem/E

DFS/BFS

每一次操作都可以使连通的结点变色,所以可以将连通的点缩成一个点(由于Python的栈空间过小,这个操作只能用bfs;其他语言如c++可以直接dfs)。

由于缩点后的树的结点是黑白相间的,将整棵树变成相同颜色的最小操作数为:在树的中点不断操作将整棵树变成相同颜色所需要的操作数,也就是整棵树的最大半径。

求树的最大半径可以用一次dfs求得:

 def getAns(v):
vis[v] = 1
global ans
m1, m2 = 0, 0
for x in edge[v]:
if vis[x] == 0:
t = getAns(x)
if t > m1:
m1, m2 = t, m1
elif t > m2:
m2 = t
ans = max(ans, m1 + m2 + 1)
return m1 + 1

然而Python栈空间过小,只能考虑其他做法,这里使用的是两个bfs:

第一个bfs找出以root为根的深度最大的结点u(树的直径两端的结点必有一个为此结点)

第二次bfs找出以结点u为根的深度最大的结点v,此时v的深度则为树的直径

代码如下:

 # import sys
# sys.setrecursionlimit(1000000000)
from collections import defaultdict, deque def buildTree(root):
q = deque()
q.append((root, root))
vis = [0 for _ in range(n + 1)]
vis[root] = 1
while q:
v, fa = q.pop()
for x in preedge[v]:
if vis[x] != 1:
vis[x] = 1
if col[x] == col[fa]:
q.append((x, fa))
else:
edge[fa].append(x)
edge[x].append(fa)
q.append((x, x)) def getDeep(root):
vis = [0 for _ in range(n + 1)]
d = {}
q = deque()
q.append(root)
vis[root] = 1
d[root] = 0
while q:
u = q.pop()
for x in edge[u]:
if vis[x] == 0:
vis[x] = 1
d[x] = d[u] + 1
q.append(x)
return d n = int(input())
precol = [int(_) for _ in input().split()]
preedge = [[] for _ in range(n + 1)]
for _ in range(n - 1):
x, y = [int(_) for _ in input().split()]
preedge[x].append(y)
preedge[y].append(x) root = (n + 1) // 2
edge = [[] for _ in range(n + 1)]
col = [0 for _ in range(n + 1)]
for x in range(1, n + 1):
col[x] = precol[x - 1]
buildTree(root) d = getDeep(root)
u = max(d.keys(),key=(lambda k:d[k]))
print((max(getDeep(u).values()) + 1 ) // 2)

由于Python栈空间过小的原因,一直在test15 RE,改了一天,感觉还是C/C++用起来舒心=。=

Anton and Tree的更多相关文章

  1. Codeforces 734E. Anton and Tree 搜索

    E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...

  2. 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 ...

  3. 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 ...

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

    题目链接: Anton and Tree 题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字 ...

  5. Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路

    题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...

  6. 【27.91%】【codeforces 734E】Anton and Tree

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. Codeforces Round #379 (Div. 2) E. Anton and Tree

    题意: 给一颗树 每个节点有黑白2色 可以使一个色块同事变色,问最少的变色次数. 思路: 先缩点 把一样颜色的相邻点 缩成一个 然后新的树 刚好每一层是一个颜色. 最后的答案就是树的直径/2 不过我用 ...

  8. cf734 E. Anton and Tree

    这个题的题意还是很劲的.搞了好久才知道是怎么变得. (假设已经缩好了点,每次边中间颜色不同的,然后和就和他外面的相同,继续再变这个大的,依次类推,最多就是树的直径D/2) (还是英语水平太弱了(吐槽+ ...

  9. Codeforces734 E. Anton and Tree

    传送门:>Here< 题意:给出一颗树,节点不是黑色就是白色,每次可以将一个颜色相同的块变颜色,问最少变几次才能让其变为同色 解题思路: 我们考虑由于每一次都是把同样颜色的色块进行变色,因 ...

随机推荐

  1. [转]Libev教程

    libev Table of Contents 1 libev 1.1 About The Code 1.2 EventLoop 1.3 Watcher 1.4 How it works 1.4.1 ...

  2. 开发框架(OrchardNoCMS)介绍(一)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(一) Orchard CMS是针对CMS开发的,对于很多开发需求来说,内容管理这块儿可能并不需要,而需要它的模块式开发 ...

  3. Pi

    Math]Pi   数学知识忘地太快,在博客记录一下pi的生成. 100 Decimal places 3.1415926535897932384626433832795028841971693993 ...

  4. cocos2d(背景图片循环滚动)

    背景图片循环滚动 使用action 实现的: 主要有两个背景图片交替循环滚动:我选的两个背景图片的宽度都是1024的 ,所以定义了#define BGIMG_WIDTH 1024 代码如下: 在Hel ...

  5. 线性判别分析算法(LDA)

    1. 问题 之前我们讨论的PCA.ICA也好,对样本数据来言,可以是没有类别标签y的.回想我们做回归时,如果特征太多,那么会产生不相关特征引入.过度拟合等问题.我们可以使用PCA来降维,但PCA没有将 ...

  6. 探讨 : Host在IIS上的WCF Service的执行方式

    一个WCF请求由两个线程来完成 运行在IIS上的WCF service, 你可能会注意到一个比较有趣的现象. 当WCF service接收到一个请求时, 这个请求实际上会有两个线程在执行这个请求. 一 ...

  7. ngx-push-stream模块源码学习(四)——订阅

    一.概述 push stream模块允许三种模式的订阅者: longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略 stream:与服务端保持长连接,持续不断的请求-&g ...

  8. MSSQL Server查询优化方法(转)

    核心提示:查询速度慢的原因很多,常见如下几种 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3. ...

  9. 读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF)

    读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF) 这次介绍的这个框架只适用于中小项目,并且各个读写数据库结构是一致的情况,还要并且是写入数据库只有1台情况. 我们来看看这个子系 ...

  10. 使用Varnish+ESI实现静态页面的局部缓存(思路篇)

    使用Varnish+ESI实现静态页面的局部缓存(思路篇) 页面静态化是搭建高性能网站必用的招式之一,页面静态化可以有效提升系统响应速度,同时也有利于搜索引擎优化.但在页面静态化后,静态页面之间包含( ...