예제 #1
1
        /// <summary>
        /// Perform a Quick Find on a small text file.
        /// </summary>
        /// <param name="unionFind">The union find to be tested.</param>
        internal static void CommonUnionFindTiny(IUnionFind unionFind)
        {
            using (In input = new In("Algs4-Data\\TinyUF.txt"))
             {
            int initialComponentCount = input.ReadInt();
            unionFind.IsolateComponents(initialComponentCount);
            while (!input.IsEmpty())
            {
               int siteP = input.ReadInt();
               int siteQ = input.ReadInt();
               if (unionFind.Connected(siteP, siteQ))
               {
                  continue;
               }

               unionFind.Union(siteP, siteQ);
            }
             }

             Assert.AreEqual(2, unionFind.Count);
        }
예제 #2
0
        public void TestUnion()
        {
            _sut.Union(4, 3);
            Assert.AreEqual(9, _sut.Count());
            Assert.IsTrue(_sut.IsConnected(4, 3));
            Assert.AreEqual(4, _sut.Find(3));
            Assert.AreEqual(4, _sut.Find(4));

            _sut.Union(3, 8);
            Assert.AreEqual(8, _sut.Count());
            Assert.IsTrue(_sut.IsConnected(3, 8));
            Assert.AreEqual(4, _sut.Find(3));
            Assert.AreEqual(4, _sut.Find(8));
        }
        /// <summary>
        /// Common portion of file input UnionFind tests.
        /// </summary>
        /// <param name="streamName">The name for the input stream.</param>
        /// <param name="unionFind">The union find to be tested.</param>
        /// <returns>The Union Find structure.</returns>
        public static IUnionFind UnionFindCommon(string streamName, IUnionFind unionFind)
        {
            if (null == streamName)
             {
            throw new ArgumentNullException("streamName");
             }

             if (null == unionFind)
             {
            throw new ArgumentNullException("unionFind");
             }

             using (In input = new In(streamName))
             {
            int initialComponentCount = input.ReadInt();
            unionFind.IsolateComponents(initialComponentCount);
            while (!input.IsEmpty())
            {
               int siteP = input.ReadInt();
               int siteQ = input.ReadInt();
               if (unionFind.Connected(siteP, siteQ))
               {
                  continue;
               }

               unionFind.Union(siteP, siteQ);
            }

            return unionFind;
             }
        }
예제 #4
0
        private void TestFind(IUnionFind uf)
        {
            Assert.AreEqual(100, uf.Components().Count, "The given UnionFind algorithm must be defined for 100 nodes");

            bool result;

            /* Initially, I find no path */
            result = uf.Find(0, 1);
            Assert.AreEqual(result, false);

            /* Test directly connected nodes */
            uf.Union(0, 1);
            result = uf.Find(0, 1);
            Assert.AreEqual(result, true);

            /* Test indirectly connected nodes */
            uf.Union(1, 2);
            result = uf.Find(0, 2);
            Assert.AreEqual(result, true);

            /* Test non-connected nodes */
            result = uf.Find(0, 9);
            Assert.AreEqual(result, false);

            /* Test find in an union of all nodes */
            Random     random     = new Random();
            List <int> components = uf.Components();

            for (int i = 3; i < components.Count; i++)
            {
                uf.Union(i - 1, i);
            }

            components = uf.Components();
            for (int i = 0; i < components.Count; i++)
            {
                int p = random.Next(0, components.Count);
                int q = random.Next(0, components.Count);
                result = uf.Find(p, q);
                Assert.AreEqual(result, true);
            }
            Assert.AreEqual(CountConnectedComponents(components), 1);
        }
예제 #5
0
        private void TestUnion(IUnionFind uf)
        {
            Assert.AreEqual(100, uf.Components().Count, "The given UnionFind algorithm must be defined for 100 nodes");

            List <int> components;

            /* Test union of two nodes */
            uf.Union(0, 1);
            components = uf.Components();
            Assert.AreEqual(components[0], components[1]);
            Assert.AreEqual(CountConnectedComponents(components), components.Count - 1);

            /* Test union of three nodes */
            uf.Union(1, 2);
            components = uf.Components();
            Assert.AreEqual(components[0], components[1]);
            Assert.AreEqual(components[1], components[2]);
            Assert.AreEqual(CountConnectedComponents(components), components.Count - 2);

            /* Test random unions */
            Random random = new Random();
            List <Tuple <int, int> > connections = new List <Tuple <int, int> >();

            for (int i = 0; i < components.Count; i++)
            {
                int p = random.Next(0, components.Count);
                int q = random.Next(0, components.Count);
                connections.Add(new Tuple <int, int>(p, q));
                uf.Union(p, q);
            }

            components = uf.Components();
            foreach (var con in connections)
            {
                Assert.AreEqual(components[con.Item1], components[con.Item2]);
            }
        }
예제 #6
0
        private string GetNotConnectedUnions()
        {
            List <string> result = new List <string>();

            for (int i = 0; i < _unions.GetLength(0); i++)
            {
                int p = _unions[i, 0];
                int q = _unions[i, 1];

                if (!_unionFind.Connected(p, q))
                {
                    _unionFind.Union(p, q);
                    result.Add($"{p} {q}");
                }
            }

            return(string.Join(" : ", result));
        }
        public void WhenCall_Union_ShouldReturnCorrectComponentAndConnectedResults()
        {
            // Arrange
            var testDataSet = FakeUnionData.Data();

            // Act
            foreach (var obj in testDataSet)
            {
                int  p = (int)obj[0];
                int  q = (int)obj[1];
                int  componentCount = (int)obj[2];
                int  dot1           = (int)obj[3];
                int  dot2           = (int)obj[4];
                bool res            = (bool)obj[5];
                unionFind.Union(p, q);

                // Assert
                Assert.Equal(unionFind.Count(), componentCount);
                Assert.Equal(unionFind.Connected(dot1, dot2), res);
            }
        }
예제 #8
0
 public void TestUnion()
 {
     sut.Union(0, 1);
     Assert.AreEqual(1, sut.Find(0));
     Assert.AreEqual(9, sut.Count());
 }
 public void Union(int source, int destination)
 {
     _unionFind.Union(source, destination);
 }