标签:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 40005
#define maxe 205
int fa[maxn],dis[maxn],ancestor[maxn];
bool vis[maxn];
int first[maxn],nxt[maxn<<1],to[maxn<<1],cost[maxn<<1],e;
int qfirst[maxn],qnxt[maxe<<1],qto[maxe<<1],qpre[maxe<<1],qe;
int n,m;
void add(int u,int v,int c){
to[e]=v;cost[e]=c;nxt[e]=first[u];first[u]=e++;
}
void qadd(int u,int v){
qto[qe]=v;qpre[qe]=u;qnxt[qe]=qfirst[u];qfirst[u]=qe++;
}
void inital(){
e=0;
qe=0;
dis[1]=0;
for(int i=0;i<=n;i++){
fa[i]=i;
vis[i]=0;
first[i]=-1;
qfirst[i]=-1;
}
}
int finds(int x){
if(fa[x]!=x)return fa[x]=finds(fa[x]);
}
void unions(int x,int y){
int a=finds(x);
int b=finds(y);
if(a!=b)fa[b]=a;
}
void lca(int u,int fa){
for(int i=first[u];~i;i=nxt[i]){
int v=to[i];int c=cost[i];
if(v==fa)continue;
if(!vis[v]){
dis[v]=dis[u]+c;
lca(v,u);
unions(u,v);
}
}
vis[u]=true;
for(int i=qfirst[u];~i;i=qnxt[i]){
int qv=qto[i];
if(vis[qv]){
ancestor[i]=ancestor[i^1]=finds(qv);
}
}
}
int main()
{
int t,u,v,c;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
inital();
for(int i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&c);
add(u,v,c);
add(v,u,c);
}
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
qadd(u,v);
qadd(v,u);
}
lca(1,-1);
for(int i=0;i<m;i++){
int root=ancestor[i<<1];
int u=qpre[i<<1];
int v=qto[i<<1];
printf("%d\n",dis[u]+dis[v]-2*dis[root]);
}
}
}
1
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u013497977/article/details/47306075