1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<vector>
5 using namespace std;
6 struct dian{
7 int v,id;
8 };
9 int now;
10 vector<dian>mp[100005];
11 int vis[100005],next[200005],head[200005],point[200005],value[200005],father[100005];
12 int num[100005][3],dis[100005];
13 void add(int u,int v,int w)
14 {
15 next[++now]=head[u];
16 head[u]=now;
17 point[now]=v;
18 value[now]=w;
19 }
20 int findf(int x)
21 {
22 if (x!=father[x]) father[x]=findf(father[x]);
23 return father[x];
24 }
25 void tarjan(int u)
26 {
27 int i,v,id,w;
28 vis[u]=1;
29 for (i=0;i<mp[u].size();i++)
30 {
31 v=mp[u][i].v; id=mp[u][i].id;
32 if (vis[v]) num[id][2]=findf(v);
33 }
34 for (i=head[u];i!=-1;i=next[i])
35 {
36 v=point[i]; w=value[i];
37 if (!vis[v])
38 {
39 dis[v]=dis[u]+w;
40 tarjan(v);
41 father[v]=u;
42 }
43 }
44 return;
45 }
46 int main()
47 {
48 int T,i,x,y,w,n,m;
49 dian n1,n2;
50 scanf("%d",&T);
51 while (T--)
52 {
53 scanf("%d%d",&n,&m);
54 now=0;
55 memset(vis,0,sizeof(vis));
56 memset(dis,0,sizeof(dis));
57 memset(head,-1,sizeof(head));
58 for (i=1;i<n;i++)
59 {
60 scanf("%d%d%d",&x,&y,&w);
61 add(x,y,w); add(y,x,w);
62 }
63 for (i=1;i<=m;i++)
64 {
65 scanf("%d%d",&x,&y);
66 num[i][0]=x; num[i][1]=y;
67 n1.v=y; n1.id=i;
68 mp[x].push_back(n1);
69 n1.v=x; n1.id=i;
70 mp[y].push_back(n1);
71 }
72 for (i=1;i<=n;i++) father[i]=i;
73 tarjan(1);
74 for (i=1;i<=m;i++)
75 printf("%d\n",dis[num[i][0]]+dis[num[i][1]]-2*dis[num[i][2]]);
76 }
77 return 0;
78 }
http://acm.hdu.edu.cn/showproblem.php?pid=2586