public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); var G = new List <(int, int, long)>(N + M); for (var i = 1; i <= N; i++) { var c = Scanner.Scan <int>(); G.Add((0, i, c)); } for (var i = 0; i < M; i++) { var(a, b, r) = Scanner.Scan <int, int, long>(); G.Add((a, b, r)); } G.Sort((x, y) => x.Item3.CompareTo(y.Item3)); var answer = 0L; var dsu = new DisjointSetUnion(N + 1); foreach (var(u, v, r) in G) { if (dsu.IsSame(u, v)) { continue; } dsu.Merge(u, v); answer += r; } Console.WriteLine(answer); }
public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); var E = new List <(int U, int V, long C)>(); var dsu = new DisjointSetUnion(N); for (var i = 0; i < M; i++) { var(a, b, c) = Scanner.Scan <int, int, long>(); if (c >= 0) { E.Add((a - 1, b - 1, c)); } else { dsu.Merge(a - 1, b - 1); } } E.Sort((x, y) => x.C.CompareTo(y.C)); var answer = 0L; foreach (var(u, v, c) in E) { if (dsu.IsSame(u, v)) { answer += c; continue; } dsu.Merge(u, v); } Console.WriteLine(answer); }
public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); var dsu = new DisjointSetUnion(N); var count = new int[N]; Array.Fill(count, 1); var check = new bool[N]; check[0] = true; for (var i = 0; i < M; i++) { var(x, y) = Scanner.Scan <int, int>(); x--; y--; count[x]--; count[y]++; check[y] |= check[x]; if (count[x] == 0) { check[x] = false; } dsu.Merge(x, y); } var answer = 0; for (var i = 0; i < N; i++) { if (dsu.IsSame(0, i) && check[i]) { answer++; } } Console.WriteLine(answer); }
public static void Solve() { var N = Scanner.Scan <int>(); var M = 400000; var dsu = new DisjointSetUnion(M); var edge = new int[M]; for (var i = 0; i < N; i++) { var(a, b) = Scanner.Scan <int, int>(); var u = dsu.LeaderOf(a - 1); var v = dsu.LeaderOf(b - 1); var w = u; if (!dsu.IsSame(u, v)) { w = dsu.Merge(u, v); edge[w] += edge[w == u ? v : u]; } edge[w]++; } var answer = 0; for (var i = 0; i < M; i++) { if (dsu.LeaderOf(i) == i) { answer += Math.Min(edge[i], dsu.SizeOf(i)); } } Console.WriteLine(answer); }
public static void Solve() { var(N, Q) = Scanner.Scan <int, int>(); var dsu = new DisjointSetUnion(N + 1); for (var i = 0; i < Q; i++) { var(l, r) = Scanner.Scan <int, int>(); l--; dsu.Merge(l, r); } var answer = dsu.IsSame(0, N); Console.WriteLine(answer ? "Yes" : "No"); }
public static void Solve() { var(N, Q) = Scanner.Scan <int, int>(); var C = Scanner.ScanEnumerable <int>().Select(x => x - 1).ToArray(); var dsu = new DisjointSetUnion(N); var count = new Dictionary <int, int> [N].Select(_ => new Dictionary <int, int>()).ToArray(); for (var i = 0; i < N; i++) { if (!count[i].ContainsKey(C[i])) { count[i][C[i]] = 0; } count[i][C[i]]++; } while (Q-- > 0) { var(q, a, b) = Scanner.Scan <int, int, int>(); a--; b--; if (q == 1) { if (dsu.IsSame(a, b)) { continue; } var la = dsu.LeaderOf(a); var lb = dsu.LeaderOf(b); dsu.Merge(a, b); var na = dsu.LeaderOf(a); var nb = na == la ? lb : la; foreach (var(key, value) in count[nb]) { if (!count[na].ContainsKey(key)) { count[na][key] = 0; } count[na][key] += value; } } else { var l = dsu.LeaderOf(a); Console.WriteLine(count[l].ContainsKey(b) ? count[l][b] : 0); } } }
public static void Solve() { var(N, Q) = Scanner.Scan <int, int>(); var dsu = new DisjointSetUnion(N); while (Q-- > 0) { var(p, a, b) = Scanner.Scan <int, int, int>(); if (p == 0) { dsu.Merge(a, b); } else { Console.WriteLine(dsu.IsSame(a, b) ? "Yes" : "No"); } } }
public static void Solve() { var(N, M, S) = Scanner.Scan <int, int, int>(); var G = new List <int> [N].Select(x => new List <int>()).ToArray(); for (var i = 0; i < M; i++) { var(a, b) = Scanner.Scan <int, int>(); a--; b--; if (a > b) { (a, b) = (b, a); } G[a].Add(b); } var dsu = new DisjointSetUnion(N); for (var u = N - 1; u >= S; u--) { foreach (var v in G[u]) { dsu.Merge(u, v); } } var answer = new List <int>(); answer.Add(S); S--; for (var u = S - 1; u >= 0; u--) { foreach (var v in G[u]) { dsu.Merge(u, v); } if (dsu.IsSame(S, u)) { answer.Add(u + 1); } } answer.Reverse(); Printer.Print1D(answer, "\n"); }
public static void Solve() { var N = Scanner.Scan <int>(); var A = Scanner.ScanEnumerable <int>().ToArray(); var dsu = new DisjointSetUnion((int)2e5 + 1); var answer = 0; for (var i = 0; i < N / 2; i++) { var(a, b) = (A[i], A[N - 1 - i]); if (dsu.IsSame(a, b)) { continue; } dsu.Merge(a, b); answer++; } Console.WriteLine(answer); }
public static void Solve() { var(N, M, Q) = Scanner.Scan <int, int, int>(); var E1 = new Edge[M]; var E2 = new Edge[Q]; for (var i = 0; i < M; i++) { var(a, b, c) = Scanner.Scan <int, int, int>(); a--; b--; E1[i] = new Edge(-1, a, b, c); } for (var i = 0; i < Q; i++) { var(a, b, c) = Scanner.Scan <int, int, int>(); a--; b--; E2[i] = new Edge(i, a, b, c); } var answer = new bool[Q]; var dsu = new DisjointSetUnion(N); foreach (var e in E1.Concat(E2).OrderBy(x => x.Cost)) { if (dsu.IsSame(e.U, e.V)) { continue; } if (e.ID == -1) { dsu.Merge(e.U, e.V); } else { answer[e.ID] = true; } } Console.WriteLine(string.Join("\n", answer.Select(x => x ? "Yes" : "No"))); }
public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); var G = new List <int> [N].Select(x => new List <int>()).ToArray(); for (var i = 0; i < M; i++) { var(a, b) = Scanner.Scan <int, int>(); a--; b--; if (a > b) { (a, b) = (b, a); } G[a].Add(b); } var answer = new List <int>(N); var dsu = new DisjointSetUnion(N); var curr = 0; for (var u = N - 1; u >= 0; u--) { answer.Add(curr); curr++; foreach (var v in G[u]) { if (!dsu.IsSame(u, v)) { curr--; } dsu.Merge(u, v); } } answer.Reverse(); Console.WriteLine(string.Join("\n", answer)); }
public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); var P = Scanner.ScanEnumerable <int>().Select(x => x - 1).ToArray(); var dsu = new DisjointSetUnion(N); for (var i = 0; i < M; i++) { var(x, y) = Scanner.Scan <int, int>(); dsu.Merge(x - 1, y - 1); } var answer = 0; for (var i = 0; i < N; i++) { if (dsu.IsSame(P[i], i)) { answer++; } } Console.WriteLine(answer); }
public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); var NM = N + M; var X = new long[NM]; var Y = new long[NM]; var C = new long[NM]; for (var i = 0; i < NM; i++) { var(x, y, c) = Scanner.Scan <long, long, long>(); X[i] = x; Y[i] = y; C[i] = c; } double GetCost(int u, int v) { var(dx, dy) = (X[u] - X[v], Y[u] - Y[v]); var cost = Math.Sqrt(dx * dx + dy * dy); if (C[u] != C[v]) { cost *= 10; } return(cost); } var big = new List <(int U, int V, double C)>(); for (var i = 0; i < N; i++) { for (var j = i + 1; j < N; j++) { big.Add((i, j, GetCost(i, j))); } } var answer = double.MaxValue; for (var s = 0; s < 1 << M; s++) { var costs = big.ToList(); for (var i = 0; i < M; i++) { if ((s >> i & 1) == 1) { for (var j = 0; j < N; j++) { costs.Add((j, N + i, GetCost(j, N + i))); } for (var j = i + 1; j < M; j++) { if ((s >> j & 1) == 1) { costs.Add((N + i, N + j, GetCost(N + i, N + j))); } } } } costs.Sort((x, y) => x.C.CompareTo(y.C)); var dsu = new DisjointSetUnion(NM); var cost = 0d; foreach (var(u, v, c) in costs) { if (dsu.IsSame(u, v)) { continue; } cost += c; dsu.Merge(u, v); } answer = Math.Min(answer, cost); } Console.WriteLine(answer); }
public static void Solve() { var N = Scanner.Scan <int>(); var S1 = Scanner.Scan <string>(); var S2 = Scanner.Scan <string>(); var hashset = new HashSet <char>(); foreach (var c in S1) { hashset.Add(c); } foreach (var c in S2) { hashset.Add(c); } var dsu = new DisjointSetUnion(char.MaxValue); for (var i = 0; i < N; i++) { dsu.Merge(S1[i], S2[i]); } var answer = 1L; var used = new bool[char.MaxValue]; var first = false; for (var i = 0; i < 10; i++) { first |= dsu.IsSame(i + '0', S1[0]); first |= dsu.IsSame(i + '0', S2[0]); } if (!first) { answer *= 9; } used[S1[0]] = used[S2[0]] = true; for (var i = 1; i < N; i++) { if (used[S1[i]] || used[S2[i]]) { continue; } var ok = false; for (var j = 0; j < 10; j++) { ok |= dsu.IsSame(j + '0', S1[i]); ok |= dsu.IsSame(j + '0', S2[i]); } if (ok) { continue; } used[S1[i]] = used[S2[i]] = true; if (first) { answer *= 10; } else if (!dsu.IsSame(S1[0], S1[i])) { answer *= 10; } } Console.WriteLine(answer); }