public void TestUnionTExceptions() { int length = 10; IUnionFind uf = new UnionFindT(length); //Grupos iguais uf.Union(1, 2); uf.Union(1, 2); }
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); }
/// <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); }
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)); } }