这是一个很裸的LCA。
觉得hzwer的LCA模版更加优美,于是膜拜了一下。
#include<cstdio> #include<algorithm> using namespace std; int fa[1005][12],f[1005],n,q,en,h[1005],deep[1005],flg[1005]; struct Edge{ int b,v,next; }e[2005]; void add(int sa,int sb,int sc){ e[++en].b=sb; e[en].v=sc; e[en].next=h[sa]; h[sa]=en; } void Yuchuli(int u){ flg[u]=1; for(int i=1;i<=10;i++){ if(deep[u]<(1<<i))break; fa[u][i]=fa[fa[u][i-1]][i-1]; } for(int i=h[u];i;i=e[i].next){ int v=e[i].b; if(flg[v])continue; f[v]=f[u]+e[i].v; fa[v][0]=u; deep[v]=deep[u]+1; Yuchuli(v); } } int LCA(int u,int v){ if(deep[u]<deep[v])swap(u,v); int dep=deep[u]-deep[v]; for(int i=0;i<=10;i++)if((1<<i)&dep)u=fa[u][i]; for(int i=10;i>=0;i--){ if(fa[u][i]!=fa[v][i]){ u=fa[u][i]; v=fa[v][i]; } } return u==v?u:fa[u][0]; } int main(){ freopen("1602.in","r",stdin); freopen("1602.out","w",stdout); scanf("%d %d",&n,&q); for(int i=1;i<n;i++){ int sa,sb,sc; scanf("%d %d %d",&sa,&sb,&sc); add(sa,sb,sc); add(sb,sa,sc); } Yuchuli(1); while(q--){ int sa,sb; scanf("%d %d",&sa,&sb); printf("%d\n",f[sa]+f[sb]-2*f[LCA(sa,sb)]); } return 0; }