Anton and Tree
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的更多相关文章
- Codeforces 734E. Anton and Tree 搜索
E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...
- 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 ...
- 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(缩点+树的直径)
题目链接: Anton and Tree 题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字 ...
- 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 ...
- 【27.91%】【codeforces 734E】Anton and Tree
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Codeforces Round #379 (Div. 2) E. Anton and Tree
题意: 给一颗树 每个节点有黑白2色 可以使一个色块同事变色,问最少的变色次数. 思路: 先缩点 把一样颜色的相邻点 缩成一个 然后新的树 刚好每一层是一个颜色. 最后的答案就是树的直径/2 不过我用 ...
- cf734 E. Anton and Tree
这个题的题意还是很劲的.搞了好久才知道是怎么变得. (假设已经缩好了点,每次边中间颜色不同的,然后和就和他外面的相同,继续再变这个大的,依次类推,最多就是树的直径D/2) (还是英语水平太弱了(吐槽+ ...
- Codeforces734 E. Anton and Tree
传送门:>Here< 题意:给出一颗树,节点不是黑色就是白色,每次可以将一个颜色相同的块变颜色,问最少变几次才能让其变为同色 解题思路: 我们考虑由于每一次都是把同样颜色的色块进行变色,因 ...
随机推荐
- OA小助手
基于 WPF + Modern UI 的 公司OA小助手 开发总结 前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会 ...
- Sublime2 Text编辑器使用技巧
Sublime2 Text编辑器使用技巧 ------------------------------------软件使用----------------------------------- ...
- HashTable和HashSet中的类型陷阱
HashTable和HashSet中的类型陷阱 发现这个陷阱的起因是这样的:我现在有上百万字符串,我准备用TopK算法统计出出现次数做多的前100个字符串. 首先我用Hashtable统计出了每个字符 ...
- [iOS]封装单例类
[iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...
- 需要我们了解的SQL Server阻塞原因与解决方法
需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...
- .Net程序员面试试题
1:简述private protected public internal修饰符的访问权限? private:私有成员在类的内部可以访问: protected:受保护的成员,在类的内部和继承类中可以访 ...
- 自制AutoMapper实现DTO到持久层Entity的转换
自制AutoMapper实现DTO到持久层Entity的转换 项目中经常涉及到页面DTO更新,保存到数据库的操作,这就必然牵扯到DTO和持久层对象的转换,常见的第三方库有: java:dozer .n ...
- mongDB主从
MongoDB[第二篇]MongodDB主从 官方网站:http://www.mongodb.org/ MongoDB的一些参数 --logpath 日志文件路径 --master 指定为主机器 -- ...
- Quagga添加自己的命令
参考了王斌的文档:http://down.51cto.com/data/621454 TIP:笔者使用的版本是0.99.20 需求:在接口模式下添加一条"ip ospf enable&quo ...
- WIN7操作平台获取管理员权限批处理
在WIN7操作平台打开某些文件,如果需要管理员权限才能打开.通过下面的操作就可以获取管理员权限 创建批处理register文件.文件内容为,文件后缀名为.reg.然后双击该文件.打开需要访问的文件,如 ...