一道板子题。
直接树链剖分维护树上lca然后差分就行了。
代码:
#include<bits/stdc++.h>
#define N 50005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
struct Node{int v,next,w;}e[N<<1];
int n,m,cnt=0,first[N],fa[N],hson[N],siz[N],top[N],dep[N],dis[N];
inline void add(int u,int v,int w){e[++cnt].v=v,e[cnt].w=w,e[cnt].next=first[u],first[u]=cnt;}
inline int dfs(int p){
siz[p]=1,hson[p]=0;
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==fa[p])continue;
fa[v]=p,dep[v]=dep[p]+1,dis[v]=dis[p]+e[i].w,dfs(v),siz[p]+=siz[v];
if(siz[v]>siz[hson[p]])hson[p]=v;
}
}
inline void dfs1(int p,int tp){
top[p]=tp;
if(!hson[p])return;
dfs1(hson[p],tp);
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v!=fa[p]&&v!=hson[p])dfs1(v,v);
}
}
inline int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])x^=y,y^=x,x^=y;
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline void write(int x){
if(x>9)write(x/10);
putchar(x%10^48);
}
int main(){
n=read();
for(int i=1;i<n;++i){
int u=read()+1,v=read()+1,w=read();
add(u,v,w),add(v,u,w);
}
dfs(1);
dfs1(1,1);
m=read();
while(m--){
int x=read()+1,y=read()+1,z=lca(x,y);
write(dis[x]+dis[y]-2*dis[z]),puts("");
}
return 0;
}