-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathLCA.cpp
123 lines (113 loc) · 2.1 KB
/
LCA.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Algorithm: 离线LCA
* Date: 2015-08-26
* Contest: 练习
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 1<<29
#define mod 1000000007
#define mem(a,b) memset(a,b,sizeof(a))
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long LL;
const int N=100007;
struct Adj{
int to,w;
int nxt;
}E[2][N];
int tot[2];
int head[2][N];
int dist[N],vis[N];
int uset[N];
void add_edge(int u,int v,int w,int kind)
{
E[kind][tot[kind]].to=v;
E[kind][tot[kind]].w=w;
E[kind][tot[kind]].nxt=head[kind][u];
head[kind][u]=tot[kind]++;
}
int find_set(int x)
{
if(uset[x]!=x)
{
uset[x]=find_set(uset[x]);
}
return uset[x];
}
void union_set(int x,int y)
{
int fx,fy;
fx=find_set(x);
fy=find_set(y);
if(fx==fy) return;
else
uset[fx]=fy;
}
void tarjan(int u)
{
uset[u]=u;
vis[u]=0;
for(int i=head[0][u];i!=-1;i=E[0][i].nxt)
{
int v=E[0][i].to;
if(vis[v]==-1)
{
dist[v]=dist[u]+E[0][i].w;
tarjan(v);
uset[v]=u;
}
}
vis[u]=1;
for(int i=head[1][u];i!=-1;i=E[1][i].nxt)
{
int v=E[1][i].to;
if(vis[v]==1)
{
E[1][i].w=dist[u]+dist[v]-2*dist[find_set(v)];
}
}
}
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
tot[0]=tot[1]=0;
mem(head,-1);
mem(vis,-1);
int u,v,k;
scanf("%d%d",&n,&m);
for(int i=1;i<=n-1;i++)
{
scanf("%d%d%d",&u,&v,&k);
add_edge(u,v,k,0);
add_edge(v,u,k,0);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add_edge(u,v,0,1);
add_edge(v,u,0,1);
}
dist[1]=0;
tarjan(1);
for(int i=0;i<tot[1];i++)
{
if(E[1][i].w)
printf("%d\n",E[1][i].w);
}
}
return 0;
}