diff --git a/tp4/lib_conjunto.c b/tp4/lib_conjunto.c
index 3ddab0985eaa95b7e2c5728d9f1903f718e188b9..b4907d7544caef4ee8671a873e61a3071b204c82 100644
--- a/tp4/lib_conjunto.c
+++ b/tp4/lib_conjunto.c
@@ -26,7 +26,6 @@ conjunto_t *cria_cjt(int max) {
 }
 
 conjunto_t *destroi_cjt(conjunto_t *c) {
-	c->card = 0;
 	free(c->v);
 	c->v = NULL;
 	free(c);
diff --git a/tp4/tp4 b/tp4/tp4
new file mode 100755
index 0000000000000000000000000000000000000000..9d9ad0fca0d22b2b508e54470ba4c6ec6a2a4732
Binary files /dev/null and b/tp4/tp4 differ
diff --git a/tp4/tp4.c b/tp4/tp4.c
index 5f3e4f622e533d00d8d7e7474616da66f2de6c62..d7f510c2a98ab1543c4ce206cf79e620cb9fee3a 100644
--- a/tp4/tp4.c
+++ b/tp4/tp4.c
@@ -3,19 +3,106 @@
 #include "lib_conjunto.h"
 #define MAX 100
 
-int main ()
-{
+conjunto_t *le_conjunto_simples(int max) {
+	conjunto_t *leitura;
+	if ( !(leitura = cria_cjt(max)) )
+		return NULL;
+	int n;
+	scanf("%d", &n);
+	while (n) {
+		insere_cjt(leitura, n);
+		scanf("%d", &n);
+	}
+	return leitura;
+}
 
-    /* ler os herois e suas habilidades */
+conjunto_t **le_vetor_conjuntos(int *tam, int max) {
+	conjunto_t **vetor_c;
+	if ( !(vetor_c = malloc(sizeof(conjunto_t *) * max)) )
+		return NULL;
+	int n, m;
+	scanf("%d", &n);
+	while (n) {
+		if ( !(vetor_c[*tam] = cria_cjt(10)) )
+			return NULL;
+		insere_cjt(vetor_c[*tam], n);
+		scanf("%d", &m);
+		while (m) {
+			insere_cjt(vetor_c[*tam], m);
+			scanf("%d", &m);
+		}
+		*tam = *tam + 1;
+		scanf("%d", &n);
+	}
+	return vetor_c;
+}
 
-    /* ler a missao */
+conjunto_t **libera_vetor_conjuntos(conjunto_t **vetor_c, int tam) {
+	int i;
+	for (i = 0; i < tam; i++)
+		vetor_c[i] = destroi_cjt(vetor_c[i]);
+	free(vetor_c);
+	return NULL;
+}
 
+conjunto_t *acha_solucao(conjunto_t **herois, conjunto_t *missao, conjunto_t **equipes, int tam_equipes) {
+	conjunto_t *menor;
+	menor = cria_cjt(10);
+	conjunto_t *uniao_old;
+	conjunto_t *uniao;
+	int i, j;
+	
+	for (i = 0; i < tam_equipes; i++) {
+		uniao = copia_cjt(herois[equipes[i]->v[0] - 1]);
+		/* copia o conjunto de habilidades de heroi	correspondente ao primeiro elemento do conjunto equipe da posicao atual do vetor de equipes. ex: se a equipe atual é [5 6 7], copia o quinto conjunto de habilidades de heroi (de indice 4). */
+		for (j = 1; j < equipes[i]->card; j++) {
+			uniao_old = uniao;
+			uniao = uniao_cjt(uniao, herois[equipes[i]->v[j] - 1]);
+			uniao_old = destroi_cjt(uniao_old);
+		}
+			/* realiza a uniao de todos os conjuntos de habilidades de heroi referenciados no conjunto equipe da posicao atual do vetor de equipes. */
+		if (contido_cjt(missao, uniao)) {
+			if (vazio_cjt(menor) || equipes[i]->card < menor->card) {
+				menor = destroi_cjt(menor);
+				menor = copia_cjt(equipes[i]);
+			}
+		}
+		uniao = destroi_cjt(uniao);
+	}
+	
+	return menor;
+}
+
+int main() {
+    /* ler os herois e suas habilidades */
+	int tam_herois = 0;
+	conjunto_t **vetor_herois;
+	vetor_herois = le_vetor_conjuntos(&tam_herois, MAX);
+	
+    /* ler a missao */
+	conjunto_t *missao;
+	missao = le_conjunto_simples(20);
+	
     /* ler as equipes de herois */
+	int tam_equipes = 0;
+	conjunto_t **vetor_equipes;
+	vetor_equipes = le_vetor_conjuntos(&tam_equipes, MAX);
 
     /* a solucao eh encontrada se a missao esta contido na uniao das 
      * habilidades de uma equipe, mas tomando-se aquela de menor tamanho. */
+	conjunto_t *solucao;
+	solucao = acha_solucao(vetor_herois, missao, vetor_equipes, tam_equipes);
+	if (vazio_cjt(solucao)) {
+		printf("NENHUMA\n");
+	} else {
+		imprime_cjt(solucao);
+	}
 
     /* libera toda a memoria alocada dinamicamente */
+	vetor_herois = libera_vetor_conjuntos(vetor_herois, tam_herois);
+	missao = destroi_cjt(missao);
+	vetor_equipes = libera_vetor_conjuntos(vetor_equipes, tam_equipes);
+	solucao = destroi_cjt(solucao);
 
     return 0;
 }