求大佬hack以 1 为根的做法,看题解也都是以 v 为根的。
#include<bits/stdc++.h>
using namespace std;
int n,u,v,cnt,deep[200010],vis[200010],jump[200010][30];
int hd[100010],ne[200010],to[200010],tot,ans;
void add(int x,int y){
tot+=1;
ne[tot]=hd[x];
hd[x]=tot;
to[tot]=y;
}
void dfs(int x,int fa){
deep[x]=deep[fa]+1;
cnt+=1;
vis[x]=cnt;
jump[x][0]=fa;
for(int i=1;i<=20;i++)
jump[x][i]=jump[jump[x][i-1]][i-1];
for(int i=hd[x];i>=1;i=ne[i])
{
if(to[i]==fa)continue;
dfs(to[i],x);
}
//lca 预处理
}
int lca(int x,int y){
if(x==y)return x;
if(vis[x]>vis[y])swap(x,y);
for(int i=20;i>=0;i--)
if(vis[jump[y][i]]>vis[x])y=jump[y][i];
return jump[y][0];
}
void dfs_max(int x,int fa){
int tu=lca(u,x);
int lu=deep[u]+deep[x]-2*deep[tu];
int tv=lca(v,x);
int lv=deep[v]+deep[x]-2*deep[tv];
if(lu<lv)ans=max(ans,lv-1);
for(int i=hd[x];i>=1;i=ne[i])
{
if(to[i]==fa)continue;
dfs_max(to[i],x);
}
}
int main(){
scanf("%d%d%d",&n,&u,&v);
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs(v,0); //这里改成 dfs(1,0)能过 AT,但不能过学校数据
dfs_max(1,0);
printf("%d",ans);
return 0;
}