SP20775
题面
有一个树,
题解
树形 dp。
定义
对
- 这条路径不经过
x ,那就是在其子节点的子树上取最长路径。 - 这条路径经过
x ,那就是在子树中取两条路径,这两条路径都以x 的子节点为路径端点,然后把这两条路径通过x 串起来。
令
第一种情况:
第二种情况比较难处理,但发现以
则对于第二种情况,取子节点中
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,r,q;
int head[N],to[2*N],nxt[2*N],idx;
int f[N][5];
void add(int x,int y) {
nxt[++idx]=head[x],head[x]=idx,to[idx]=y;
return;
}
void dfs(int x,int fa) {
int mx=0;
for(int i=head[x];i;i=nxt[i]) {
int y=to[i];
if(y!=fa) {
dfs(y,x);
f[x][0]=max(f[x][0],f[y][0]);
if(f[y][1]+1>f[x][1]) {
mx=f[x][1];
f[x][1]=f[y][1]+1;
}
else if(f[y][1]+1>mx) mx=f[y][1]+1;
}
}
f[x][0]=max(f[x][0],mx+f[x][1]);
}
int main() {
scanf("%d",&n);
for(int i=1,x,y;i<n;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);
scanf("%d",&r);
dfs(r,0);
scanf("%d",&q);
while(q--) {
int x;
scanf("%d",&x);
printf("%d\n",f[x][0]);
}
return 0;
}