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; //求logdfs(1,0,0);
}