How far away ?
#include<iostream> #include <algorithm> using namespace std; const int M=40010; int dis[M],data[4*M],ext[4*M],head[M],value[4*M],ans[205],pa[M]; int len,l,vis[M],da[900],ne[900],he[M],id[900]; int find(int x) { return x==pa[x]?x:find(pa[x]); } void add(int a,int b,int k) { value[len]=k; data[len]=b; ext[len]=head[a]; head[a]=len++; } void ad(int a,int b,int k) { id[l]=k; da[l]=b; ne[l]=he[a]; he[a]=l++; } void tarjan(int u,int fa) { vis[u]=1; int v; pa[u]=u; for(int t=head[u];t!=-1;t=ext[t]) { v=data[t]; if(v!=fa) { dis[v]=dis[u]+value[t]; tarjan(v,u); } }for(int t=he[u];t!=-1;t=ne[t]) { v=da[t]; if(vis[v])ans[id[t]]=find(v); } pa[u]=fa; } void init() { len=l=0; memset(head,-1,sizeof head); memset(ext,-1,sizeof ext); memset(ne,-1,sizeof ne); memset(he,-1,sizeof he); memset(vis,0,sizeof vis); } int main() { int T; int n,m; int x,y,z; int a[205],b[205]; scanf("%d",&T); while(T--) { init(); scanf("%d%d",&n,&m); for(int i=1;i<n;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } for(int i=1;i<=m;i++) { scanf("%d%d",&a[i],&b[i]); ad(a[i],b[i],i); ad(b[i],a[i],i); } dis[1]=0; tarjan(1,0); // puts("SDFWSD"); for(int i=1;i<=m;i++) printf("%d\n",dis[a[i]]+dis[b[i]]-2*dis[ans[i]]); //printf("%d\n",ans[i]); } } /* 9 7 5 1 2 3 1 3 2 2 4 8 2 5 5 3 6 6 3 7 4 4 5 7 3 4 6 2 6 5 7 11 6 1 2 4 1 3 5 1 4 4 2 10 6 10 11 2 3 5 7 5 6 1 4 7 3 7 8 8 7 9 9 1 6 11 9 5 4 7 8 2 11 8 9 */