Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define NODEF -1
#define MAX_ARCHIVO 80   // tamano maximo que...
printf("...n");
              ciclo = 1;
              detecta++; //contador del ciclo
          }
      //termina la part...
scanf("%s", archivo);
    printf("Abriendo archivo <%s>...n", archivo);

    // abrir para lectura al archivo definido
   ...
Upcoming SlideShare
Loading in …5
×

Deteccion de Ciclos en c

1,042 views

Published on

Published in: Business, Technology
  • Be the first to comment

  • Be the first to like this

Deteccion de Ciclos en c

  1. 1. #include <stdio.h> #include <stdlib.h> #include <assert.h> #define NODEF -1 #define MAX_ARCHIVO 80 // tamano maximo que tomara el archivo #define RAIZ -1 void bfs(int nodo, double** grafo, int num_nodos) { //aqui nodo toma el valor inicio, grafo tomara el valor de pesos y n tomara el valor de nodos. //en esta parte se reserva memoria de las variables a usar int* padre = (int*)malloc(sizeof(int)*num_nodos); int* visitado = (int*)malloc(sizeof(int)*num_nodos); int* rear = (int*)malloc(sizeof(int)*num_nodos); int contadorprinci, contadorsecu, act, detecta=0, ciclo = 0, i, ultimo; for (contadorprinci = 0; contadorprinci < num_nodos; contadorprinci++) {//contadorprinci que visitara los nodos de donde se puso que seria el nodo a iniciar visitado[contadorprinci] = 0; //estos tomaran el valor de 0 si ya se visitaron padre[contadorprinci] = RAIZ; //y despues el padre osea de donde viene tomara el valor de RAIZ que es de -1 que es donde te lo indica } do { i = 0; //i toma el valor de donde se inicio rear[i] = nodo;// inicio toma el valor de la cola //padre[nodo] = RAIZ; ultimo = 1; //al ultimo visitado se le asssigna el valor de 1 do { act = rear[i++]; //actual toma el valor de arreglo de cola que se ira incrementando visitado[act] = 1; printf("Nodo %d.n", act + 1); //indica de que parte del nodo se esta for (contadorprinci = 0; contadorprinci < num_nodos; contadorprinci++) { //se repite el contadorprincipal, pero este para ver el grafo if (grafo[act][contadorprinci] > 0.0) { // este tiene que tener en el peso de sus aristas algun valor, asi para que continue if (visitado[contadorprinci] == 0) { // aqui dice que si el nodo visitado es igual a 0 emppieza el contadorsecu, y si este es vecino prosigue for (contadorsecu = i; contadorsecu < ultimo; contadorsecu++) {// el contador tomara el valor del nodo de inicio y este sera menor al ultimo nodo if (rear[contadorsecu] == contadorprinci) { break; } } //parte del ciclo if (contadorsecu == ultimo) { //aqui indica si contasecu es igual al valor del ultimo, el arreglo de cola se incrementando y toma el valor de contaprinci y que el arreglo de padre de conta principal toma el valor del nodo actual. rear[ultimo++] = contadorprinci; padre[contadorprinci] = act; //en pocas palabras que hace si el nodo no se a visitado } } else { //en esta parte indica si ya se visito el nodo if (contadorprinci != padre[act]) { // en esta parte dse indica que si nuestro contaprincipal es diferente al nodo padre de su arreglo imprime un espacio, que indica que hay un ciclo
  2. 2. printf("...n"); ciclo = 1; detecta++; //contador del ciclo } //termina la parte del ciclo } } } } while (i < ultimo); if(ciclo==1){ break; } //libera la memoria de las variables que se pidieron free(padre); free(visitado); free(rear); // En esta parte te imprime el contador que se puso si hay ciclos, imprime cuantos, de lo contrario no imprime nada. } while (1); if(detecta>=1){ printf("Hay %d ciclo(s).n", detecta); }else{ printf("No hubon"); } return; } void imprime(double** matriz, int dim) { int r, c; for (r = 0; r < dim; r++) { for (c = 0; c < dim; c++) { printf("%1.2lf ", matriz[r][c]); } printf("n"); } return; } int main(int hola, char** bye) { int nodos = NODEF; // numero de nodos int aristas = NODEF; // numero de aristas int i, j, cont; double p; char c; double** pesos = NULL; // matriz de pesos de aristas char* archivo = NULL; // nombre de archivo de entrada FILE* acceso = NULL; // puntero de acceso al archivo int inicio = NODEF; // nodo de inicio para busquedas/recorridos archivo = (char*)malloc(sizeof(char)*MAX_ARCHIVO); assert(archivo != NULL); // lectura del grafo printf("Dame el archivo del grafo: ");
  3. 3. scanf("%s", archivo); printf("Abriendo archivo <%s>...n", archivo); // abrir para lectura al archivo definido acceso = fopen(archivo, "r"); // "r" = lectura assert(acceso != NULL); free(archivo); // liberar memoria que ya no se requiere fscanf(acceso, "%c %dn", &c, &nodos); fscanf(acceso, "%c %dn", &c, &aristas); // reservar una matriz pesos = (double**)malloc(sizeof(double*)*nodos); for (i = 0; i < nodos; i++) { pesos[i] = (double*)malloc(sizeof(double)*nodos); for (j = 0; j < nodos; j++) { pesos[i][j] = 0.0; // no hay aristas (todavia) } } printf("Leyendo un grafo de %d nodos y %d aristas...n", nodos, aristas); // leer los pesos cont = 0; do { fscanf(acceso, "%c ", &c); if (c == 'a') { fscanf(acceso, "%d %d %lfn", &i, &j, &p); // una arista nueva pesos[i-1][j-1] = pesos[j-1][i-1] = p; // guardar el peso cont++; } } while(c != 'f'); assert(aristas == cont); // cerrar archivo fclose(acceso); imprime(pesos, nodos); // recorridos printf("Define el nodo de inicio: "); scanf("%d", &inicio); // busqueda en profundidad bfs(inicio - 1, pesos, nodos); // se declara el inicio que es el que ya se dio, donde se empezara y es -1, ya que esta contenido en un arreglo, pesos es nuestra matriz de adyacencia que guardara los valores de las aristas y nodos es el numero total de nodos que hay en nuestro archivo for (i = 0; i < nodos; i++) { free(pesos[i]); } free(pesos); return 3; }

×