裸倍增。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1005;
int n,q;
int head[N],tot,fa[N][25],dis[N][25],dep[N];
struct aa
{
int to,pre,dis;
}edge[N*2];
void addedge(int x,int y,int z)
{
edge[++tot].to=y;edge[tot].dis=z;edge[tot].pre=head[x];head[x]=tot;
}
void dfs(int u,int depth)
{
dep[u]=depth;
for (int i=1;(1<<i)<depth;i++)
{
fa[u][i]=fa[fa[u][i-1]][i-1];
dis[u][i]=dis[u][i-1]+dis[fa[u][i-1]][i-1];
}
for (int i=head[u];i;i=edge[i].pre)
if (dep[edge[i].to]==0)
{
int v=edge[i].to;
fa[v][0]=u;
dis[v][0]=edge[i].dis;
dfs(v,depth+1);
}
}
int up(int &u,int dep)
{
int ans=0;
for (int i=0;i<=20;i++)
if (dep&(1<<i))
{
ans+=dis[u][i];
u=fa[u][i];
}
return ans;
}
int query(int u,int v)
{
int ans;
if (dep[u]>dep[v]) ans=up(u,dep[u]-dep[v]);
else ans=up(v,dep[v]-dep[u]);
for (int i=20;i>=0;i--)
if (fa[u][i]!=fa[v][i])
{
ans+=dis[u][i]+dis[v][i];
u=fa[u][i],v=fa[v][i];
}
if (u!=v) ans+=dis[u][0]+dis[v][0];
return ans;
}
int main()
{
scanf("%d%d",&n,&q);
int x,y,z;
for (int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
}
dfs(1,1);
while(q--)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
return 0;
}