这是 AC 的 LCA 部分:
int lca(int x,int y){
if(d[x]<d[y]){
swap(x,y);
}
int ans=min(sz[getx(x)][gety(x)],sz[getx(y)][gety(y)]);
while(d[x]^d[y]){
ans=min(ans,mi[lg[d[x]-d[y]]][x]);
x=f[lg[d[x]-d[y]]][x];
}
if(x==y){
return ans;
}
for(int i=lg[d[x]];~i;--i){
if(f[i][x]^f[i][y]){
ans=min({ans,mi[i][x],mi[i][y]});
x=f[i][x];
y=f[i][y];
}
}
return ans;
}
然而把统计答案的 ans 的初始化改一下,就 WA 60 了,为什么?按理说询问给出的两个点不相同,是不会漏统计本身贡献的啊。
int lca(int x,int y){
if(d[x]<d[y]){
swap(x,y);
}
int ans=2e9;
while(d[x]^d[y]){
ans=min(ans,mi[lg[d[x]-d[y]]][x]);
x=f[lg[d[x]-d[y]]][x];
}
if(x==y){
return ans;
}
for(int i=lg[d[x]];~i;--i){
if(f[i][x]^f[i][y]){
ans=min({ans,mi[i][x],mi[i][y]});
x=f[i][x];
y=f[i][y];
}
}
return ans;
}
本人都是把点权转边权的,并且保证正确性。