POJ1463 Strategic game 树的最小覆盖集
每一条边的两个端点至少需要选一个点,求最少点数,即为树的最小覆盖集。
树形 dp 入门题,设
fx,0 为以
x 为根的子树不选
x 的最少点数,
fx,1 为选
i 的最少点数。
fx,1=i∈son∑min{fi,0,fi,1}+1
fx,0=i∈son∑fi,1
ans=min{froot,0,froot,1}
POJ 3659 Cell Phone Network (树的最小支配集)
选择了一个点后,与自己相邻的点被覆盖,求覆盖所有点集的最少点数,即为树的最小支配集。
设
fx,0 为选
x 且
x 的子树都覆盖了,
fx,1 为不选
x 且
x 的儿子覆盖了
x,
fx,2 为不选
x 且
x 的父亲覆盖了
x。然后确定转移方程
对于
fx,0 和
fx,2 的转移是显而易见的
fx,0=1+i∈son∑min{fi,0,fi,1,fi,2}+1
fx,2=i∈son∑fi,1
对于
fx,1 稍微复杂点,因为至少要有一个儿子选了
fx,0 所以定义
inc,当选了至少一个儿子的
fi,0 时
inc=0。否则
inc 选择一个最小的
fi,0,即
inc=min{fi∈son,0−fi,1}。那么它的转移方程为
fx,1=i∈son∑min{fi,0−fi,1}
POJ 3107 Godfather (树的重心)
树的重心为删掉这个点后将树分成几个部分中点的个数最大值最小。树最多有两个重心。
令一个点为根,维护
szx 为以
x 为子树的大小,分成两种:x 下面的子树与 x 上面的部分。
void dfs(int x, int fa){
sz[x] = 1;
int maxn = 0;
for (int i = hd[x]; i; i = e[i].nxt){
int y = e[i].to;
if(y != fa){
dfs(y,x);
sz[x] += sz[y];
maxn = max(maxn, sz[y]);
}
}
maxn = max(maxn, n - sz[x]);
ans[x] = maxn;
minn = min(maxn, minn);
}
POJ 2631 Roads in the North (树的直径)
树的直径为树的最长路。
树的直径求法一:随便找一个点,然后 bfs 找到离任意一个点最远的点
u,再从最远的点
u 找到最远的点
v,那么
(u,v) 为树的直径。
树的直接求法二:树形dp。对于每个点维护
down1x(经过不同儿子向下到叶子节点的最长路) 和
down2x(经过不同儿子向下到叶子节点的次长路)。枚举一个点
i,最后的结果为
max{down1i+down2i}。不难证明对于一个节点,在只继承它的儿子最大值的前提下,它到叶子结点距离的最大值和次大致所经过的路径一定是不一样的。
拓展:定义
rx 为离
x 最远的点 与
x 的距离。树的中心为满足
rx 最小的点的
x。树的中心为直径的中点。所有的直径都经过中心。
HDU 2196 Computer (树的最远距离)
给出一棵树, 问从每个点出发所能到达的最远距离。
设
fx,0 为以
x 为根的子树中离
x 的最远距离,
fx,1 为以
x 为根的子树中离
x 的次远距离,这个东西很好转移,我们从下往上进行树形 dp,对于儿子传递的信息,先与它的最远距离比较,不行的话再与次元距离比较。
刚才的两个状态是最远路径一开始是往下走的,还有一开始往上走的,中途可能拐下来的。设
fx,2 为
x 一开始往上走的最远距离。从上向下进行树形 dp,转移方程如下,约定
∈/ 与
∈ 含义为不经过和经过,
z 为
(x,y) 的长。
fy∈son,2=max{fx,0+z,fx,2+z}(fx,0∈/y)
fy∈son,2=max{fx,1+z,fx,2+z}
ansx=max{fx,0,fx,2}
拓展:如果题目求的是经过每个点的最长链怎么写?易知经过
x 的最长链为
ansx=max{fx,0+fx,2,fx,0+fx,1}
HDU 6035 Colorful Tree
给定一棵
n 个点的树,每个点都有颜色
ci。定义两点间距离为路径上不同颜色的数量。求两两点对距离和。
来学习一下套路。将问题转换成每个颜色对答案的贡献,即为有多少条路径经过它,求个补集是有多少条路径不经过它。所以枚举颜色并标记,进行树形 dp 即可。也可以重新构图,对每个联通树进行 dfs。
一棵大小为
n 的树有
2n×(n−1) 条路径。
CF1101D GCD Counting
给定一棵有点权的树,求树上满足点权
gcd=1 的最长路径。
最长路径有两个考虑方式,断点和 lca。端点需要记录最长链,次长链,和往上的最长链即为到根的路径。lca 需要记录向下的两个最长链。
扯回来,gcd 怎么记录在状态中,记录每个 gcd 是不合理的。既然题说了
gcd=1 就有贡献,就记录质因子即可。
1×3×5×7×11×13×17=255255>2×105
UVA10859 Placing Lampposts
给定一个
n 点
m 边的无向无环图,在尽可能少的节点上放灯,使得所有边与灯相邻。并在灯数最少的前提下,被照亮的边应尽可能多。求最少灯数,被两个灯和一个灯照亮的边数。
无向无环图是一个森林,只考虑一棵树。设
fi,0/1 为第
i 个点不放和放灯的最少灯数。但要求在灯树最少的前提下被照亮的边尽可能多,所以把放灯的花费设为一个极大值。把儿子放灯了父亲也放灯的花费设为一,求最小花费即可。
P3177 树上染色
给定一个
n 个点的树,有边权。给定
k,将
k 个点染成黑色,其它染成白色。收益是所有黑点两两之间和白点两两之间的距离和。求最大收益。
设
fi,j 为在子树
i 中选
j 个点对答案的贡献。
考虑黑白间是独立的,对于一棵子树,它的一个儿子中的节点想要走到另一个儿子,条件是另一个儿子的子树中有与它同色的。那么将其它子树看成一个整体,在结合父亲的信息,可以求出儿子经过连向父亲的边多少次。
可以发现是一个树形依赖背包。