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); }
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"); } } } }
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(' ')); }