数据给的小,暴力了许多。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn 41000
#define maxm 100000
#define LL long long
struct Que
{
int a,b;
int vis;
LL ans;
void getData()
{
scanf("%d %d",&a,&b);
vis=0;
}
}que[210];
int head[maxn],v[maxm],next[maxm],cnt;
LL w[maxm];
LL dis[maxn];
int father[maxn];
int n,m;
void init()
{
memset(dis,0,sizeof(dis));
memset(head,-1,sizeof(head));
for(int i=1;i<=n;i++)
father[i]=i;
cnt=0;
}
void add(int a,int b,LL c)
{
v[cnt]=b;
w[cnt]=c;
next[cnt]=head[a];
head[a]=cnt++;
}
int getFather(int x)
{
if(father[x]==x)
return x;
return father[x]=getFather(father[x]);
}
void Union(int a,int b)
{
father[b]=a;
}
void LCA(int x)
{
for(int i=0;i<m;i++)
if(que[i].vis==0)
{
if(x==que[i].a&&dis[que[i].b]!=0)
{
que[i].ans=dis[x]+dis[que[i].b]-2*dis[getFather(que[i].b)];
que[i].vis=1;
}
else
{
if(x==que[i].b&&dis[que[i].a]!=0)
{
que[i].ans=dis[x]+dis[que[i].a]-2*dis[getFather(que[i].a)];
que[i].vis=1;
}
}
}
for(int i=head[x];~i;i=next[i])
{
int to=v[i];
if(dis[to]==0)
{
dis[to]=dis[x]+w[i];
LCA(to);
Union(x,to);
}
}
}
int main()
{
int t;
int a,b;
LL c;
cin>>t;
while(t--)
{
cin>>n>>m;
init();
for(int i=0;i<n-1;i++)
{
scanf("%d%d%I64d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
for(int i=0;i<m;i++)
que[i].getData();
LCA(1);
for(int i=0;i<m;i++)
printf("%I64d\n",que[i].ans);
}
return 0;
}