军训完。发现我自己连lca版都不会了
然后就强行写了这个题
然后卡了两天的原因就是计算距离写错了
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
using std::swap;
using std::abs;
const int maxn=501000;
struct node
{
int p;
int nxt;
};
node line[maxn<<1];
int head[maxn],tail;
int st[maxn][30],Log[maxn];
int dep[maxn];
void add(int a,int b)
{
line[++tail].p=b;
line[tail].nxt=head[a];
head[a]=tail;
}
void dfs(int now,int f)
{
st[now][0]=f;
dep[now]=dep[f]+1;
for(int i=1;i<=Log[dep[now]];i++)
st[now][i]=st[st[now][i-1]][i-1];
for(int i=head[now];i;i=line[i].nxt)
if(line[i].p!=f)
dfs(line[i].p,now);
}
int Lca(int a,int b)
{
if(dep[a]<dep[b]) swap(a,b);
for(int i=Log[dep[a]];i>=0;i--)
if(dep[st[a][i]]>=dep[b])
a=st[a][i];
if(a==b) return a;
for(int i=Log[dep[a]];i>=0;i--)
if(st[a][i]!=st[b][i])
a=st[a][i],b=st[b][i];
return st[a][0];
}
int dist(int lca,int a,int b,int c)
{
return abs(dep[lca]-dep[a])+abs(dep[lca]-dep[b])+abs(dep[lca]-dep[c]);
}
void solve(int a,int b,int c)
{
int lca1=Lca(a,b),lca2=Lca(a,c),lca3=Lca(b,c);
if(lca1==lca2)
printf("%d ",lca3);
else if(lca1==lca3)
printf("%d ",lca2);
else if(lca2==lca3)
printf("%d ",lca1);
printf("%d\n",dep[a]+dep[b]+dep[c]-dep[lca1]-dep[lca2]-dep[lca3]);//就是这个鬼地方
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
int a,b,c;
for(int i=1;i<n;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,0);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
solve(a,b,c);
}
}