Esempio n. 1
0
        public void TestUnionTExceptions()
        {
            int        length = 10;
            IUnionFind uf     = new UnionFindT(length);

            //Grupos iguais
            uf.Union(1, 2);
            uf.Union(1, 2);
        }
Esempio n. 2
0
        public void TestFindTSimple()
        {
            int        length = 10;
            IUnionFind uf     = new UnionFindT(length);

            for (int i = 1; i < length; i++)
            {
                Assert.AreEqual(i, uf.Find(i));
            }
        }
Esempio n. 3
0
        public void TestUnionTExceptions2()
        {
            int        length = 10;
            IUnionFind uf     = new UnionFindT(length);

            //2 é o representante do grupo
            uf.Union(1, 2);

            //Passei um indice (1) que não é de representante
            uf.Union(1, 3);
        }
Esempio n. 4
0
        /// <summary>
        /// Algoritmo de Kruskal com diversas implementações.
        /// </summary>
        /// <param name="implementationType">Tipo de implemantação que será usada para executar o algoritmo</param>
        /// <returns></returns>
        public int Kruskal(KruskalType implementationType)
        {
            //Declaração de variáveis auxiliares
            int minimumSpaningTreeCost = 0;

            //IUnionFind é uma interface, sua implementação será escolhida no swich abaixo
            IUnionFind unionFind = null;

            //Verifica qual é o tipo de implementação do kruskal foi escolhida e executa as ações condizentes
            switch (implementationType)
            {
            case KruskalType.LinkedListUFHeapSort:

                //Union Find implementado com listas encadeadas
                unionFind = new UnionFindLL(this.numberOfVertices);

                //Faz o sorting com o HeapSort (in place)
                Sorting.Heap <Edge> .HeapSort(ref graphEdges);

                break;

            case KruskalType.TreeUFHeapSort:

                //Union Find implementado com arvores
                unionFind = new UnionFindT(this.numberOfVertices);

                //Faz o sorting com o HeapSort (in place)
                Sorting.Heap <Edge> .HeapSort(ref graphEdges);

                break;

            case KruskalType.LinkedListUFCountingSort:

                //Union Find implementado com listas encadeadas
                unionFind = new UnionFindLL(this.numberOfVertices);

                //Faz o sorting com o CountingSort
                graphEdges = Sorting.Sorting <Edge> .CountingSort(graphEdges, this.maxWeight);

                break;

            case KruskalType.TreeUFCountingSort:

                //Union Find implementado com arvores
                unionFind = new UnionFindT(this.numberOfVertices);

                //Faz o sorting com o CountingSort
                graphEdges = Sorting.Sorting <Edge> .CountingSort(graphEdges, this.maxWeight);

                break;

            default:

                throw new ArgumentException("Tipo de Kruskal não especificado.");
            }

            //Percorre a lista ordenada de Arestas.
            //Termina o looping quando todos os vértices já tiverem sido colocados na arvore geradora mínima.
            int i = 1;
            int j = 0;

            while (i < this.numberOfVertices)
            {
                //Decobre os conjuntos aos quais os vértices pertencem
                int set1 = unionFind.Find(graphEdges[j].Item2.vertexTo);
                int set2 = unionFind.Find(graphEdges[j].Item2.vertexFrom);

                //Verifica se os vértices pertencem ao mesmo grupo (forma ciclo)
                if (set1 != set2)
                {
                    //Soma o risco da aresta ao risco total da arvore geradora mínima
                    minimumSpaningTreeCost += graphEdges[j].Item1;
                    //Une os conjuntos nos quais estão os vértices da aresta que foi adicionada na árvore geradora mínima
                    unionFind.Union(set1, set2);
                    i++;
                }

                j++;
            }

            return(minimumSpaningTreeCost);
        }
Esempio n. 5
0
        public void TestUnionT()
        {
            int        length = 10;
            IUnionFind uf     = new UnionFindT(length);

            uf.Union(1, 2);

            Assert.AreEqual(uf.Find(1), uf.Find(2));

            for (int i = 3; i < length; i++)
            {
                Assert.AreNotEqual(uf.Find(1), uf.Find(i));
                Assert.AreNotEqual(uf.Find(2), uf.Find(i));
            }

            uf.Union(3, 4);

            Assert.AreEqual(uf.Find(3), uf.Find(4));

            int set34 = uf.Find(3);

            for (int i = 5; i < length; i++)
            {
                Assert.AreNotEqual(uf.Find(3), uf.Find(i));
                Assert.AreNotEqual(uf.Find(4), uf.Find(i));
            }

            int set5 = uf.Find(5);

            uf.Union(uf.Find(3), uf.Find(5));

            Assert.AreEqual(uf.Find(3), uf.Find(5));
            Assert.AreEqual(uf.Find(4), uf.Find(5));

            Assert.AreEqual(set34, uf.Find(3));
            Assert.AreEqual(set34, uf.Find(4));
            Assert.AreEqual(set34, uf.Find(5));

            for (int i = 6; i < length; i++)
            {
                Assert.AreNotEqual(uf.Find(3), uf.Find(i));
                Assert.AreNotEqual(uf.Find(4), uf.Find(i));
                Assert.AreNotEqual(uf.Find(5), uf.Find(i));
            }

            for (int i = 6; i < length; i++)
            {
                Assert.AreEqual(i, uf.Find(i));
            }

            uf.Union(uf.Find(1), uf.Find(3));
            uf.Union(uf.Find(2), uf.Find(6));
            uf.Union(uf.Find(3), uf.Find(7));
            uf.Union(uf.Find(5), uf.Find(8));
            uf.Union(uf.Find(8), uf.Find(9));
            uf.Union(uf.Find(1), uf.Find(10));

            for (int i = 2; i < length; i++)
            {
                Assert.AreEqual(uf.Find(i - 1), uf.Find(i));
            }
        }