codeforces树上的专题
codeforces上关于树上的问题的专题训练
黎辰
其实一切只为一个理由,一切理由在一个人面前也都沦为借口
展开
-
codeforces 337D D. Book of Evil(树形dp)
题目链接:codeforces 337D题目大意:给出一棵树,给出感染物的感染范围,给出一些已经确定被感染的点,问感染物可能放置的点的个数。题目分析:定义状态dp[i]代表某个点到达离它最远的确定的感染点的距离。然后我们首先dfs一遍,求得以1为根的树,每个点到子树中的感染点的最大距离,然后再dfs一遍,求得dp[i]所要求的值,利用一个dd[i]数组表示第i点的父亲,除了自己及以自己为根的子树原创 2015-10-03 20:50:28 · 1969 阅读 · 0 评论 -
codeforces 455C C. Civilization(树形dp+树的直径+并查集)
题目链接:codeforces 455C题目大意:给出一些点,他们之间初始存在一些边,给出两种操作,第一种是查询某个点所在的树的直径,另一种是将两个树合并,要求使合并后的树的直径最小。题目分析:首先算取没做操作前的连通块里的树的直径,也就是先dfs一遍,找到深度最大的点,然后从这个点再搜,找到的最远的距离就是这棵树的直径,因为可以证明从根搜深度最大的点一定是树的直径的一个端点,因为它可以通过到达次原创 2015-10-03 16:30:06 · 2477 阅读 · 0 评论 -
codeforces 161D D. Distance in Tree(树形dp)
题目链接:codeforces 161D题目大意:给出一棵树,每条边的边权是1,问两点之间的路径长度为k的点对有多少个?题目分析:定义状态dp[i][k]代表以i为根的子树中的点到达点i的长度为k的点的个数。定义V为与u相邻的点的集合,p是u的父亲然后转移方程很简单:dp[u][j]=∑v∈Vdp[v][j−1]dp[u][j]= \sum_{v \in V}dp[v][j-1]然后我们利用处原创 2015-09-16 15:27:10 · 1997 阅读 · 0 评论