using System; class UnionFind { private int[] parent; public UnionFind(int size) { parent = new int[size]; for (int i = 0; i < size; i++) { parent[i] = i; } } public int Find(int x) { if (parent[x] != x) { parent[x] = Find(parent[x]); } return parent[x]; } public void Union(int a, int b) { int rootA = Find(a); int rootB = Find(b); if (rootA != rootB) { parent[rootB] = rootA; } } public void PrintParents() { for (int i = 0; i < parent.Length; i++) { Console.Write(parent[i] + " "); } Console.WriteLine(); } } class Program { static void Main() { UnionFind uf = new UnionFind(5); uf.Union(0, 1); uf.Union(1, 2); uf.Union(3, 4); uf.Find(2); uf.PrintParents(); } }
After unions, 0,1,2 are connected with 0 as root, and 3,4 connected with 3 as root. Calling Find(2) compresses the path so 2 points directly to 0. The parents array shows roots for each element.
using System; class UnionFind { private int[] parent; public UnionFind(int n) { parent = new int[n]; for (int i = 0; i < n; i++) parent[i] = i; } public int Find(int x) { if (parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; } public void Union(int a, int b) { int rootA = Find(a); int rootB = Find(b); if (rootA != rootB) parent[rootB] = rootA; } public void PrintParents() { foreach (var p in parent) Console.Write(p + " "); Console.WriteLine(); } } class Program { static void Main() { UnionFind uf = new UnionFind(6); uf.Union(0, 1); uf.Union(1, 2); uf.Union(2, 3); uf.Union(4, 5); uf.Find(3); uf.Find(5); uf.PrintParents(); } }
After unions, 0-3 are connected with 0 as root, 4-5 connected with 4 as root. Finds compress paths so 1,2,3 point directly to 0 and 5 points to 4.
class UnionFind { private int[] parent; public UnionFind(int n) { parent = new int[n]; for (int i = 0; i < n; i++) parent[i] = i; } public int Find(int x) { if (parent[x] == x) { return x; } else { parent[x] = Find(parent[x]); return parent[x]; } } }
The else branch does not return a value after assigning parent[x]. This causes a compile-time error for missing return statement.
using System; class UnionFind { private int[] parent; public UnionFind(int n) { parent = new int[n]; for (int i = 0; i < n; i++) parent[i] = i; } public int Find(int x) { if (parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; } public void Union(int a, int b) { int rootA = Find(a); int rootB = Find(b); if (rootA != rootB) parent[rootB] = rootA; } public void PrintParents() { foreach (var p in parent) Console.Write(p + " "); Console.WriteLine(); } } class Program { static void Main() { UnionFind uf = new UnionFind(7); uf.Union(0, 1); uf.Union(1, 2); uf.Union(3, 4); uf.Union(5, 6); uf.Union(4, 5); uf.Find(6); uf.Find(2); uf.PrintParents(); } }
Unions connect 0-1-2 with root 0, 3-4-5-6 with root 3 after union of 4 and 5. Finds compress paths so 6 points to 3 and 2 points to 0.
Path compression shortens paths by making every node on the find path point directly to the root, effectively flattening the tree and reducing height.
