对于每一个父节点为1的子树,只需求出它们每一个点的深度,进行sort,然后在进行dp
因为每一个结点只允许有一只蚂蚁,对于同一个父节点下的蚂蚁,只能在上一只蚂蚁出发后1秒出发,也会晚到1秒,不难想出方程dp[j]=max(dp[j],dp[j-1]+1);
放代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){
ll a=0,b=getchar(),c=1;
while(!isdigit(b))c=b=='-'?-1:1,b=getchar();
while(isdigit(b))a=a*10+b-'0',b=getchar();
return a*c;
}
struct edge{
int to,next;
}e[1000005];
int n,ab,ans,dp[500005],h[500005];
void add(int x,int y){
ab++,e[ab]={y,h[x]},h[x]=ab;
}
void dfs(int x,int y,int d){
bool z=true;
for(int i=h[x];i;i=e[i].next)
if(e[i].to!=y)z=false,dfs(e[i].to,x,d+1);
if(z)dp[ab]=d,ab++;
}
int main(){
n=read();
for(int i=1;i<n;i++){
int x=read(),y=read();
add(x,y),add(y,x);
}
for(int i=h[1];i;i=e[i].next){
ab=0,dfs(e[i].to,1,0);
sort(dp,dp+ab);
for(int j=1;j<ab;j++)
dp[j]=max(dp[j],dp[j-1]+1);
ans=max(ans,dp[ab-1]+1);
}
printf("%d",ans);
return 0;
}