//public RangeAddFenwickTree seg; public void init(HLTreeGraph G) { //seg = new RangeAddFenwickTree(heavy.Count + 2); }
public void Solve() { var n = sc.Integer(); var a = sc.Integer() - 1; var b = sc.Integer() - 1; var F = new int[n - 1]; var T = new int[n - 1]; for (int i = 0; i < n - 1; i++) { F[i] = sc.Integer() - 1; T[i] = sc.Integer() - 1; } var H = new HLTreeGraph(n); for (int i = 0; i < n - 1; i++) { H.AddEdge(sc.Integer() - 1, sc.Integer() - 1); } H.Build(b); var G = Enumerate(n, x => new List <int>()); var win = new bool[n]; for (int i = 0; i < n - 1; i++) { var f = F[i]; var t = T[i]; var d = H.Query(f, t); if (d >= 3) { win[f] = win[t] = true; } //else { G[f].Add(t); G[t].Add(f); } } var D = Enumerate(n, x => H.Query(b, x) * 2); var E = Enumerate(n, x => 1000000000); E[a] = 0; var q = new Queue <int>(); q.Enqueue(a); while (q.Count > 0) { var p = q.Dequeue(); if (win[p]) { IO.Printer.Out.WriteLine(-1); return; } foreach (var to in G[p]) { var d = E[p] + 2; if (D[to] > d && E[to] > d) { E[to] = d; q.Enqueue(to); } } } Debug.WriteLine(D.AsJoinedString()); Debug.WriteLine(E.AsJoinedString()); var max = 0L; for (int i = 0; i < n; i++) { if (E[i] < 1000000) { max = Math.Max(max, D[i]); } } IO.Printer.Out.WriteLine(max); }