“log base 2 of maxn”:以2为底maxn的对数.
定义数组:
int bzfa[maxn]["log base 2 of maxn"];
输入:
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
bzfa[b][0]=a;
if(bzfa[a][0]==0)
{
root=a;
}
}
BFS计算dep:
void BFS(int i)
{
queue<int>q;
q.push(i);
vis[i]=1;
while(!q.empty())
{
int t=q.front(); q.pop();
for(int k=0;k<g[t].size();k++)
{
int j=g[t][k];
if(vis[j]) continue;
dep[j]=dep[t]+1;
vis[j]=1;
q.push(j);
}
}
}
预处理bzfa数组:
void BZ_LCA()
{
for(int j=1;j<="log base 2 of maxn";j++)
{
for(int i=1;i<=n;i++)
{
bzfa[i][j]=bzfa[bzfa[i][j-1]][j-1];
}
}
}
LCA:
int LCA(int x,int y)
{
if(dep[x]<dep[y])
{
swap(x,y);
}
int depdif=dep[x]-dep[y];
for(int i=0;i<="log base 2 of maxn";i++)
{
if((1<<i) & depdif)
{
x=bzfa[x][i];
}
}
if(x==y) return x;
for(int i="log base 2 of maxn";i>=0;i--)
{
if(bzfa[x][i]!=bzfa[y][i])
{
x=bzfa[x][i];
y=bzfa[y][i];
}
}
x=bzfa[x][0];
return x;
}