Exemple #1
0
        public override void Solve(IOManager io)
        {
            var cities = io.ReadInt();
            var roads  = io.ReadInt();
            var uf     = new UnionFindTree(cities);

            for (int i = 0; i < roads; i++)
            {
                var a = io.ReadInt() - 1;
                var b = io.ReadInt() - 1;
                uf.Unite(a, b);
            }

            io.WriteLine(uf.Groups - 1);
        }
Exemple #2
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var n = inputStream.ReadInt();
            var a = inputStream.ReadIntArray().Select((v, i) => new ValueAndIndex(v, i)).ToArray();
            var b = inputStream.ReadIntArray().Select((v, i) => new ValueAndIndex(v, i)).ToArray();

            Array.Sort(a);
            Array.Sort(b);

            if (!InitialCheck(a, b))
            {
                yield return("No");
            }
            else
            {
                var swapLoops = new UnionFindTree(n);
                for (int i = 0; i < a.Length; i++)
                {
                    swapLoops.Unite(a[i].Index, b[i].Index);
                }

                if (swapLoops.Groups > 1)
                {
                    yield return("Yes");
                }
                else
                {
                    var ok = false;
                    for (int i = 0; i + 1 < b.Length; i++)
                    {
                        if (a[i + 1].Value <= b[i].Value)
                        {
                            ok = true;
                            break;
                        }
                    }

                    if (ok)
                    {
                        yield return("Yes");
                    }
                    else
                    {
                        yield return("No");
                    }
                }
            }
        }
Exemple #3
0
        public override IEnumerable <object> Solve(TextReader inputStream)
        {
            var(n, k, l) = inputStream.ReadValue <int, int, int>();
            var roads    = new UnionFindTree(n);
            var railways = new UnionFindTree(n);

            for (int i = 0; i < k; i++)
            {
                var(p, q) = inputStream.ReadValue <int, int>();
                p--;
                q--;
                roads.Unite(p, q);
            }

            for (int i = 0; i < l; i++)
            {
                var(r, s) = inputStream.ReadValue <int, int>();
                r--;
                s--;
                railways.Unite(r, s);
            }

            var counter = new Counter <RootPair>();
            var pairs   = new RootPair[n];

            for (int i = 0; i < n; i++)
            {
                var pair = new RootPair(roads._nodes[i].FindRoot().ID, railways._nodes[i].FindRoot().ID);
                pairs[i] = pair;
                counter[pair]++;
            }

            var results = new Queue <long>();

            foreach (var pair in pairs)
            {
                results.Enqueue(counter[pair]);
            }

            yield return(results.Join(' '));
        }