题目大意:一棵树上(T次问询,每次)给出三个节点,求哪个点能让三点到这个点的距离和最短,输出这个点的编号和距离和最小值
哪位dalao能帮我康康问题出在哪
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=500009;
ll n,T,L,p[N][30],d[N],timer,tI[N],tO[N];
vector<ll> to[N];
void pre_dfs(ll u,ll fa){
d[u]=d[fa]+1;
tI[u]=++timer;
p[u][0]=fa;
for(ll i=1;i<=L;i++){
p[u][i]=p[p[u][i-1]][i-1];
}
for(ll i=0;i<to[u].size();i++){
ll v=to[u][i];
if(v==fa) continue;
pre_dfs(v,u);
}
tO[u]=++timer;
}
bool up(ll u,ll v){
return tI[u]<=tI[v]&&tO[u]>=tO[v]||!u;
}
ll lca(ll u,ll v){
if(up(u,v)) return u;
if(up(v,u)) return v;
for(ll i=L;i>=0;i--){
if(!up(p[u][i],v)){
u=p[u][i];
}
}
return p[u][0];
}
ll dst(ll u,ll v){
ll fa=lca(u,v);
return d[u]+d[v]-2*d[fa];
}
int main(){
freopen("bighead.in","r",stdin);
freopen("bighead.out","w",stdout);
cin>>n>>T;
for(ll i=1,u,v;i<n;i++){
cin>>u>>v;
to[u].push_back(v);
to[v].push_back(u);
}
L=log(n)/log(2)+1;
pre_dfs(1,0);
while(T--){
ll x,y,z,ans;
cin>>x>>y>>z;
if(min(d[x],d[y])>=d[z]){
ans=lca(x,y);
cout<<ans<<" "<<dst(x,y)+dst(z,ans)<<endl;
}
else if(min(d[x],d[z])>=d[y]){
ans=lca(x,z);
cout<<ans<<" "<<dst(x,z)+dst(y,ans)<<endl;
}
else if(min(d[y],d[z])>=d[x]){
ans=lca(y,z);
cout<<ans<<" "<<dst(y,z)+dst(x,ans)<<endl;
}
}
return 0;
}
调了半天都wa,还不给输入输出样例,气死我了