Exemple #1
0
 //public RangeAddFenwickTree seg;
 public void init(HLTreeGraph G)
 {
     //seg = new RangeAddFenwickTree(heavy.Count + 2);
 }
Exemple #2
0
        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);
        }