关于树根
查看原帖
关于树根
1020186
zhouxianzhuo楼主2024/8/20 16:41

求大佬hack以 11 为根的做法,看题解也都是以 vv 为根的。

#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;
}
2024/8/20 16:41
加载中...