1
+ import java .util .ArrayDeque ;
2
+ import java .util .ArrayList ;
3
+ import java .util .Deque ;
4
+
5
+ public class JW_1761 {
6
+
7
+ static int n ;
8
+ static ArrayList <ArrayList <Node >> tree = new ArrayList <>();
9
+ static int [] depth , dist ;
10
+ static int [] parent ;
11
+
12
+ static class Node {
13
+ int v ;
14
+ int w ;
15
+
16
+ Node (int v , int w ) {
17
+ this .v = v ;
18
+ this .w = w ;
19
+ }
20
+ }
21
+
22
+ public static void main (String [] args ) throws Exception {
23
+ n = read ();
24
+ parent = new int [n + 1 ];
25
+ depth = new int [n + 1 ];
26
+ dist = new int [n + 1 ];
27
+ for (int i = 0 ; i < n + 1 ; i ++)
28
+ tree .add (new ArrayList <>());
29
+ for (int i = 0 ; i < n - 1 ; i ++) {
30
+ int u = read (), v = read (), w = read ();
31
+ tree .get (u ).add (new Node (v , w ));
32
+ tree .get (v ).add (new Node (u , w ));
33
+ }
34
+ bfs ();
35
+ StringBuilder sb = new StringBuilder ();
36
+ int t = read ();
37
+ while (t -- > 0 ) {
38
+ int a = read (), b = read ();
39
+ sb .append (LCA (a , b )).append ("\n " );
40
+ }
41
+ System .out .println (sb );
42
+ }
43
+
44
+ static void bfs () {
45
+ boolean [] visited = new boolean [n + 1 ];
46
+ Deque <Node > dq = new ArrayDeque <>();
47
+ dq .offer (new Node (1 , 0 ));
48
+ visited [1 ] = true ;
49
+ while (!dq .isEmpty ()) {
50
+ Node cur = dq .poll ();
51
+ for (Node next : tree .get (cur .v )) {
52
+ if (visited [next .v ])
53
+ continue ;
54
+ parent [next .v ] = cur .v ;
55
+ depth [next .v ] = depth [cur .v ] + 1 ;
56
+ dist [next .v ] = dist [cur .v ] + next .w ;
57
+ visited [next .v ] = true ;
58
+ dq .offer (next );
59
+ }
60
+ }
61
+ }
62
+
63
+ static long LCA (int a , int b ) {
64
+ long result = dist [a ] + dist [b ];
65
+ int depthA = depth [a ];
66
+ int depthB = depth [b ];
67
+
68
+ if (depthB < depthA ) {
69
+ int tmp = a ;
70
+ a = b ;
71
+ b = tmp ;
72
+ }
73
+
74
+ int diff = Math .abs (depthA - depthB );
75
+ for (int i = 0 ; i < diff ; i ++)
76
+ b = parent [b ];
77
+
78
+ while (a != b ) {
79
+ a = parent [a ];
80
+ b = parent [b ];
81
+ }
82
+ return result - 2 * dist [a ];
83
+ }
84
+
85
+ private static int read () throws Exception {
86
+ int c , n = System .in .read () & 15 ;
87
+ while ((c = System .in .read ()) >= 48 )
88
+ n = (n << 3 ) + (n << 1 ) + (c & 15 );
89
+ if (c == 13 )
90
+ System .in .read ();
91
+ return n ;
92
+ }
93
+ }
0 commit comments