Implemente uma classe UnionFind em C++, com a interface mostrada no arquivo t6_unionfind.h abaixo.
#ifndef T6_UNIONFIND_H
#define T6_UNIONFIND_H
#include <vector>
class UnionFind
{
public:
//Inicializa a UnionFind com o numero de elementos
UnionFind(int n);
//Destrutor
~UnionFind();
//Retorna a raiz do conjunto a que u pertence
int buscar(int u);
//Une os dois conjuntos que contém u e v
void unir(int u, int v);
//Retorna o numero de conjuntos diferentes
int numeroConjuntos();
private:
std::vector pai;
std::vector tamanho;
int numConjuntos;
};
#endif // T6_UNIONFIND_H
#ifndef T6_GRAFO_KRUSKAL_H #define T6_GRAFO_KRUSKAL_H #includeclass Grafo { public: //Construtor. N = numero de vertices. Grafo( int N ); //Insere uma aresta no grafo, do nó @de para o nó @para, com peso @peso. //Caso @direcionado esteja marcado como false, insere a aresta tambem no sentido para->de void insereAresta( int de, int para, int peso = 1, bool direcionado = false ); //Imprime os vertices e seus vizinhos void mostra(); //Imprime os nos do grafo na ordem de uma busca em largura void bfs( int s ); //Imprime os nos do grafo na ordem de uma busca em profundidade void dfs(int s); //Retorna a árvore geradora mínima obtida com o algoritmo de Kruskal Grafo kruskal(); private: struct Aresta { int v; //Vertice destino int p; //Peso da aresta }; enum Cor { BRANCO, CINZA, PRETO }; //Lista de adjacencias std::vector< std::vector< Aresta > > G; }; #endif // T6_GRAFO_KRUSKAL_H