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> /// <param name="connections">用于输入的连接集合。</param> public static void Count(UF uf, Connection[] connections) { foreach (Connection c in connections) { uf.Union(c.P, c.Q); } }
/// <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); }
/// <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); }
static void Main(string[] args) { int N = Convert.ToInt32(Console.ReadLine()); UF uf = new UF(N); string input = Console.ReadLine(); int[] results = Array.ConvertAll(input.Split(' '), int.Parse); for (int i = 0; i < results.Length - 1; i += 2) { int p = results[i]; int q = results[i + 1]; if (!uf.connected(p, q)) { uf.union(p, q); Console.WriteLine($"{p} {q}"); } } }