diff --git a/scr/main.c b/scr/main.c index 4950f09..b281151 100644 --- a/scr/main.c +++ b/scr/main.c @@ -7,13 +7,14 @@ extern lista *newLista(); extern grafo *inicGrafo(); extern node *newNode(void*); +extern arco *newArco(int, int); extern void *insArco(grafo*, int, int, int); void exemploGrafoAciclico(); void exemploGrafoCiclico(); int main(){ - printf("1 equivale à VERDADEIRO; 2 equivale à FALSO\n\n"); + printf("1 equivale à VERDADEIRO; 0 equivale à FALSO\n\n"); exemploGrafoAciclico(); exemploGrafoCiclico(); @@ -24,60 +25,50 @@ int main(){ void exemploGrafoAciclico(){ printf("Grafo Aciclico\n"); - //TODO: Refactoring - /*grafo *g = inicGrafo(); - g->addAresta(g, newNode(newAresta(newVertice("1"), newVertice("2")))); - g->addAresta(g, newNode(newAresta(newVertice("1"), newVertice("5")))); - g->addAresta(g, newNode(newAresta(newVertice("1"), newVertice("4")))); - g->addAresta(g, newNode(newAresta(newVertice("2"), newVertice("5")))); - g->addAresta(g, newNode(newAresta(newVertice("3"), newVertice("6")))); - g->addAresta(g, newNode(newAresta(newVertice("4"), newVertice("6")))); - g->addAresta(g, newNode(newAresta(newVertice("4"), newVertice("7")))); - g->addAresta(g, newNode(newAresta(newVertice("5"), newVertice("7")))); - g->addAresta(g, newNode(newAresta(newVertice("6"), newVertice("8")))); - g->addAresta(g, newNode(newAresta(newVertice("7"), newVertice("8")))); - - aresta *aresta = newAresta(newVertice("1"), newVertice("8")); + grafo *g = inicGrafo(); - //Task 1-2 - printf("%d", g->existeCaminho(g, aresta)); + g->insArco(g, 3, 6, 0); + g->insArco(g, 6, 8, 0); + g->insArco(g, 1, 2, 0); + g->insArco(g, 1, 5, 0); + g->insArco(g, 1, 4, 0); + g->insArco(g, 4, 6, 0); + g->insArco(g, 4, 7, 0); + g->insArco(g, 2, 5, 0); + g->insArco(g, 5, 7, 0); + g->insArco(g, 7, 8, 0); - //Task 3 - printf("\n%d", g->existeCiclo(g, newVertice("1"))); + + arco *arco = newArco(3, 8); + + //Task 1-2 + printf("Existe caminho: %d", g->existeCaminho(g, arco)); //Task 4 - g->exibeCaminhos(g, aresta);*/ + g->exibeCaminhos(g, arco); } void exemploGrafoCiclico(){ - printf("Grafo Ciclico\n"); + printf("\nGrafo Ciclico\n"); - //TODO: Refactoring - /*grafo *g = inicGrafo(); + grafo *g = inicGrafo(); g->insArco(g, 1, 2, 3); g->insArco(g, 2, 1, 3); - g->insArco(g, 2, 3, x); - g->insArco(g, 2, 5, x); - g->insArco(g, 3, 4, x); - g->insArco(g, 4, 2, x); - g->insArco(g, 4, 5, x); - g->insArco(g, 4, 6, x); - g->addAresta(g, newNode(newAresta(newVertice("2"), newVertice("1")))); - g->addAresta(g, newNode(newAresta(newVertice("2"), newVertice("3")))); - g->addAresta(g, newNode(newAresta(newVertice("2"), newVertice("5")))); - g->addAresta(g, newNode(newAresta(newVertice("3"), newVertice("4")))); - g->addAresta(g, newNode(newAresta(newVertice("4"), newVertice("2")))); - g->addAresta(g, newNode(newAresta(newVertice("4"), newVertice("5")))); - g->addAresta(g, newNode(newAresta(newVertice("4"), newVertice("6")))); - - aresta *aresta = newAresta(newVertice("1"), newVertice("2")); + g->insArco(g, 2, 3, 0); + g->insArco(g, 2, 5, 0); + g->insArco(g, 3, 4, 0); + g->insArco(g, 4, 2, 0); + g->insArco(g, 4, 5, 0); + g->insArco(g, 4, 6, 0); + + arco *arco = newArco(3, 5); //Task 1-2 - printf("%d", g->existeCaminho(g, aresta)); + printf("Existe caminho: %d", g->existeCaminho(g, arco)); //Task 3 - printf("\n%d", g->existeCiclo(g, newVertice("5"))); + printf("\nExiste ciclo: %d", g->existeCiclo(g, 4)); //Task 4 - g->exibeCaminhos(g, aresta);*/ + g->exibeCaminhos(g, arco); } \ No newline at end of file diff --git a/scr/tad/grafo/grafo.c b/scr/tad/grafo/grafo.c index c6d9b3f..af09786 100644 --- a/scr/tad/grafo/grafo.c +++ b/scr/tad/grafo/grafo.c @@ -187,13 +187,13 @@ int buscarRelacao(lista *arestas, lista *antecessores, int sucessor) { node *n = antecessores->raiz; while(n != NULL){ arco *arco= n->elemento; + if(arco->sucessor->valor == sucessor){ + return bool_TRUE; + } if(arco->antecessor->bool_marcardo){ return bool_FALSE; } arco->antecessor->bool_marcardo = bool_TRUE; - if(arco->sucessor->valor == sucessor){ - return bool_TRUE; - } if(buscarRelacao(arestas, obterAntecessores(arestas, arco->sucessor), sucessor)){ return bool_TRUE; } @@ -234,6 +234,7 @@ lista *buscarRelacaoCompleta(lista *arestas, lista *antecessores, vertice *suces * @return 1 para verdadeiro e 0 para falso */ int existeCaminho(grafo *g, arco *a){ + desmarcarGrafo(g); node *n = g->arcos->raiz; while(n != NULL){ arco *arco= n->elemento; @@ -257,6 +258,7 @@ int existeCaminho(grafo *g, arco *a){ * @return 1 para Verdadeiro e 0 para falso */ int existeCiclo(grafo *g, int v){ + desmarcarGrafo(g); lista *antecessores = obterAntecessores(g->arcos, newVertice(v)); return buscarRelacao(g->arcos, antecessores, v); } @@ -267,5 +269,7 @@ int existeCiclo(grafo *g, int v){ * @param a Aresta */ void exibeCaminhos(grafo *g, arco *a){ + desmarcarGrafo(g); printCaminhos(buscarRelacaoCompleta(g->arcos, obterAntecessores(g->arcos, a->antecessor), a->sucessor, newLista())); -} \ No newline at end of file +} +