/// <summary> /// 随机生成连接,返回令并查集中只剩一个连通分量所需的连接总数。 /// </summary> /// <param name="uf">用于测试的并查集。</param> /// <returns>需要的连接总数。</returns> public static int Count(UF uf) { Random random = new Random(); int size = uf.Count(); int edges = 0; while (uf.Count() > 1) { int p = random.Next(size); int q = random.Next(size); uf.Union(p, q); edges++; } return(edges); }
static void Main(string[] args) { int[,] resources = new int[, ] { { 4, 3 }, { 3, 8 }, { 6, 5 }, { 9, 4 }, { 2, 1 }, { 5, 0 }, { 7, 2 }, { 6, 1 }, }; UF uf = new UF(10); for (int i = 0; i < resources.GetLength(0); i++) { var p = resources[i, 0]; var q = resources[i, 1]; if (uf.Connected(p, q)) { continue; // 如果已经连通则忽略 } uf.Union(p, q); // 归并分量 uf.Show(); } Console.WriteLine($"{uf.Count()} components."); Console.ReadKey(); }
/// <summary> /// 随机生成连接,返回令并查集中只剩一个连通分量所需的连接总数。 /// </summary> /// <param name="uf">用于测试的并查集。</param> /// <returns>需要的连接总数。</returns> public static int Count(UF uf) { var random = new Random(); var size = uf.Count(); var edges = 0; while (uf.Count() > 1) { var p = random.Next(size); var q = random.Next(size); uf.Union(p, q); edges++; } return(edges); }