1.带权边用链式前向星存
2.在LCA模板基础上维护距离
3.距离计算dis[x]+dis[y]-2*dis[lca(x,y)]
#include<iostream>
using namespace std;
const int N=1e4+5,M=2e4+5;
int n,m;
int h[N],to[M],ne[M],w[M],idx=1;
int d[N],fa[N][20],dis[N];
void add(int a,int b,int v){
to[idx]=b,ne[idx]=h[a],w[idx]=v,h[a]=idx++;
}
void dfs(int u,int f){
d[u]=d[f]+1,fa[u][0]=f;
for(int i=1;i<=19;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=h[u];i!=0;i=ne[i]){
int v=to[i];
if(v!=f){
dis[v]=dis[u]+w[i];
dfs(v,u);
}
}
}
int lca(int u,int v){
if(d[u]<d[v]) swap(u,v);
for(int i=19;i>=0;i--) if(d[fa[u][i]]>=d[v]) u=fa[u][i];
if(u==v) return u;
for(int i=19;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
int main(){
scanf("%d %d",&n,&m);
int a,b,k;
for(int i=1;i<n;i++){
scanf("%d %d %d",&a,&b,&k);
add(a,b,k),add(b,a,k);
}
dfs(a,0);
while(m--){
int x,y;scanf("%d %d",&x,&y);
printf("%d\n",dis[x]+dis[y]-2*dis[lca(x,y)]);
}
return 0;
}