void dfs(int u,int f,int d)
{
deep[u]=d;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(v==f)continue;
anc[v][0]=u;
dfs(v,u,d+1);
}
}
void solve()
{
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i<=n;i++)
{
if(anc[i][j-1]!=-1)
{
anc[i][j]=anc[anc[i][j-1]][j-1];
}
}
}
}
int lca(int x,int y)
{
int i,j;
if(deep[x]<deep[y]) swap(x,y);
for(i=0;(1<<i)<=deep[x];i++);
i--;
for(j=i;j>=0;j--)
{
if(deep[x]-(1<<j)>=deep[y])
x=anc[x][j];
}
if(x==y) return x;
for(j=i;j>=0;j--)
{
if(anc[x][j]!=-1&&anc[x][j]!=anc[y][j])
{
x=anc[x][j];
y=anc[y][j];
}
}
return anc[x][0];
}
int query(int u,int d)
{
if(d<0) return -1;
if(d==0) return u;
int i;
for(i=0;(1<<i)<=d;i++);
i--;
for(;i>=0;i--)
{
if(d>=(1<<i))
{
d-=(1<<i);
u=anc[u][i];
}
}
return u;
}
倍增lca
最新推荐文章于 2022-05-28 10:56:21 发布