예제 #1
0
        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();
        }
예제 #2
0
 /// <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);
     }
 }
예제 #3
0
        /// <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);
        }
예제 #5
0
        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}");
                }
            }
        }