public static int GetMaximumGroup(IList <int[]> pairs, int n) { if (n <= 0 || pairs == null || pairs.Count == 0) { return(-1); } var unionFind = new QuickUnion(n); foreach (var item in pairs) { unionFind.Union(item[0], item[1]); } var groupCount = new Dictionary <int, int>(); // quick find and also path compression for (int i = 0; i < n; i++) { unionFind.QuickFindAndPathCompression(i); } // Find maximum group number for (int i = 0; i < n; i++) { var rootId = unionFind.QuickFind(i); if (!groupCount.ContainsKey(rootId)) { groupCount.Add(rootId, 1); } else { groupCount[rootId]++; } } return(groupCount.Values.Max()); }