LCA模板
此处只想贴个代码。
void dfs(int x,int father,int Dep)
{
dep[x]=Dep;
for (int i=1;i<=Log[Dep-1];i++)
{
Ln[x][i]=Ln[ Ln[x][i-1] ][i-1];
Ls[x][i]=Ln[ Ln[x][i-1] ][i-1];
}
for (int i=0;i<e[x].size;i++)
if (e[x][i].to!=father)
{
Ln[ e[x][i].to ][0]=x;
Ls[ e[x][i].to ][0]=e[x][i].c;
dfs(e[x][i].to,x,Dep+1);
}
}
node GetLCA(int x,int y) //返回路径LCA和路径边权和
{
int s=0;
if (dep[x]<dep[y]) swap(x,y);
for (int i=Log[n];i>=0;i--)
if (dep[ Ln[x][i] ]>=dep[y]) s+=Ls[x][i],x=Ln[x][i]; //将x,y跳转到同一深度
if (x==y) return (node){x,s};
for (int i=Log[n];i>=0;i--)
if (Ln[x][i]!=Ln[y][i]) s+=Ls[x][i]+Ls[y][i],x=Ln[x][i],y=Ln[y][i]; //同时向上跳转
return (node){Ln[x][0],s+Ls[x][0]+Ls[y][0]};
}
void Init()
{
Log[1]=0;
for (int i=2;i<=n;i++) Log[i]=Log[i>>1]+1; //求log
dfs(1,0,0);
}