Exemplo n.º 1
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);
        }
Exemplo n.º 2
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]);
            }
        }