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); }
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); }
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)); }
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); }