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
",dis[a[i]]+dis[b[i]]-2*dis[ans[i]]);
		//printf("%d
",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
*/
原文地址:https://www.cnblogs.com/newadi/p/4662583.html