예제 #1
0
        public void UnionFind()
        {
            var elem1 = Tuple.Create(1);
            var elem2 = Tuple.Create(2);
            var elem3 = Tuple.Create(3);
            var elem4 = Tuple.Create(4);

            var unionFind = new UnionFind <Tuple <int> >();

            Assert.AreEqual(1, unionFind.Find(elem1).Item1);
            unionFind.Union(elem1, elem2);
            unionFind.Union(elem2, elem4);
            Assert.AreEqual(3, unionFind.Find(elem3).Item1);
            Assert.AreEqual(4, unionFind.Find(elem4).Item1);
            Assert.AreEqual(4, unionFind.Find(elem2).Item1);
            Assert.AreEqual(4, unionFind.Find(elem1).Item1);

            Assert.AreEqual(2, unionFind.Components().Count);
        }
예제 #2
0
    public void Solve()
    {
        int    N = Reader.Int();
        string A = Reader.String(), B = Reader.String(), all = A + B;
        var    uf  = new UnionFind(256);
        long   ans = 1;

        for (int i = 0; i < N; i++)
        {
            uf.Unite(A[i], B[i]);
        }
        foreach (var x in uf.Components().Values)
        {
            if (all.Contains((char)x[0]) && x.All(c => char.IsLetter((char)c)))
            {
                ans *= uf.Same(x[0], A[0]) ? 9 : 10;
            }
        }

        Console.WriteLine(ans);
    }
예제 #3
0
파일: 1022668.cs 프로젝트: qifanyyy/CLCDSA
    public void Solve()
    {
        int N = Reader.Int(), K = Reader.Int(), L = Reader.Int();

        int[][] E1 = Reader.IntTable(K), E2 = Reader.IntTable(L);

        var uf1 = new UnionFind(N);

        foreach (var e in E1)
        {
            uf1.Unite(e[0] - 1, e[1] - 1);
        }

        var uf2 = new UnionFind(N);

        foreach (var e in E2)
        {
            uf2.Unite(e[0] - 1, e[1] - 1);
        }

        var ans = new int[N];

        foreach (var comp in uf1.Components().Values)
        {
            var count = new Dictionary <int, int>();
            foreach (int v in comp)
            {
                AddDic(count, uf2.Root(v), 1);
            }
            foreach (int v in comp)
            {
                ans[v] = count[uf2.Root(v)];
            }
        }

        Console.WriteLine(string.Join(" ", ans));
    }
예제 #4
0
파일: 1357901.cs 프로젝트: qifanyyy/CLCDSA
    public void Solve()
    {
        int N = Reader.Int(), X = Reader.Int(), Y = Reader.Int();
        var dic = new Dictionary <int, List <int> >();

        int[] C = new int[N], W = new int[N];
        for (int i = 0; i < N; i++)
        {
            C[i] = Reader.Int(); W[i] = Reader.Int();
            AddDic(dic, C[i], i);
        }
        if (dic.Count == 1)
        {
            Console.WriteLine(1); return;
        }

        var mins = new List <int>();
        var uf   = new UnionFind(N);

        foreach (var A in dic.Values)
        {
            int minW = int.MaxValue, who = 0;
            foreach (int i in A)
            {
                if (CheckMin(ref minW, W[i]))
                {
                    who = i;
                }
            }
            mins.Add(who);
            foreach (int i in A)
            {
                if (minW + W[i] <= X)
                {
                    uf.Unite(who, i);
                }
            }
        }
        mins = mins.OrderBy(i => W[i]).ToList();
        foreach (var A in dic.Values)
        {
            for (int mi = 0; mi < 2; mi++)
            {
                if (C[mins[mi]] != C[A[0]])
                {
                    foreach (int i in A)
                    {
                        if (W[mins[mi]] + W[i] <= Y)
                        {
                            uf.Unite(mins[mi], i);
                        }
                    }
                }
            }
        }
        long ans = 1;

        modC = new ModC(N, Mod);
        foreach (var A in uf.Components().Values)
        {
            var count = new Dictionary <int, List <int> >();
            foreach (int i in A)
            {
                AddDic(count, C[i], 1);
            }
            ans *= Count(count.Values.Select(v => v.Count).ToArray());
            ans %= Mod;
        }

        Console.WriteLine(ans);
    }