SlideShare a Scribd company logo
1 of 4
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

//valores definidos para verificar los nodos en busqueda
#define NO_VISITADO 0 //define que cualquier nodo no visitado este en 0
#define VISITADO 1 //define que cualquier nodo visitado este en 1

//valores definidos para los colores
#define SIN_COLOR 1 //valor asignado a los nodos antes de la busqueda en anchura
#define COLOR_1 1
#define COLOR_2 2

//valor   definido de maximo de caracteres para el archiuvo
#define   MAX_ARCHIVO 40 //define el tamaño maximo para el archivo
#define   SINDEF -1
#define   SIN_OCUPAR 0 //define a cada valor del arreglo que no este ocupado
#define   SIN_ARISTA 0.0 //definido para la matriz que pone en 0.0 donde no hay
aristas   entre nodos
#define   ROOT -1

void bfs(int nodo, double** aristas_pesos, int nodos_max) { //nodos_max toma sus
valores de nodos previamente obtenidos al abrir el archivo .dat
  int* rear = (int*)malloc(sizeof(int)*nodos_max);
  int* color = (int*)malloc(sizeof(int)*nodos_max);
  int* padre = (int*)malloc(sizeof(int)*nodos_max);
  int* visitado = (int*)malloc(sizeof(int)*nodos_max);
  int inicio, final, valor_actual_nodo, i = 0, j; //inicio variable de apoyo al
iniciar rear, final variable para marcar cuando lleguemos al final de rear
  int conunter_conflic_color = 0;

  do{
    visitado[i] = NO_VISITADO;
    rear[i] = SIN_OCUPAR;
    padre[i] = ROOT;
    color[i] = SIN_COLOR;
    i++;
  }while(i < nodos_max);

  do {
     inicio = 0;
     rear[inicio] = nodo;//se asigna nodo que es del que partimos al inicio de la
cola
     padre[nodo] = ROOT;
     color[nodo] = COLOR_1;//se le asigna el color 1 al espacio del arreglo color
perteneciente a nodo inicial
     final = 1;//final es el siguiente en la cola
     do {
       valor_actual_nodo = rear[inicio++];//asignamos el valor de la cola inicio al
valor del nodo actual
       visitado[valor_actual_nodo] = VISITADO;//asignamos al arreglo de visitado el
primer nodo y se marca como visitado
       if (color[valor_actual_nodo] == SIN_COLOR) {
       if (color[padre[valor_actual_nodo]] == COLOR_1) {
         color[valor_actual_nodo] = COLOR_2;
       } else {
         color[valor_actual_nodo] = COLOR_1;
       }
       }
printf("Visitando a nodo %d (color %d).n",valor_actual_nodo + 1,
color[valor_actual_nodo]);

      for (i = 0; i < nodos_max; i++) {
      if (aristas_pesos[valor_actual_nodo][i] > SIN_ARISTA) { // SIN_ARISTA
definido como 0.0 ya que si no hay cambio no hay peso y por lo tanto no hay arista
        if (visitado[i] == NO_VISITADO) {
          for (j = inicio; j < final; j++) {
            if (rear[j] == i) {
            break;
            }
          }
          if (j == final) {
            // no se ha visitado
            rear[final++] = i;
            padre[i] = valor_actual_nodo;
          }
        } else {
          if (color[valor_actual_nodo] == color[i]) {
            printf("Hay dos nodos con el mismo color que son vecinos.n");
            conunter_conflic_color++;
              break;
          }//final de if conflicto de colores
        }//final de else
      }//fin de if condicion para saber si es vecino
      } //fin de for i < que el maximo numero de nodos del grafo
    } while (inicio < final);
    if (conunter_conflic_color > 0) {
    break;
    }

    } while (1);

    if (conunter_conflic_color > 0) {
      printf("No es un grafo que se pueda colorear con 2 colores:n");
      for(i = 0;i < nodos_max;i++){
        printf("[%d]t", color[i]);
      }
      printf("n");
    } else {
      printf("El grafo se puede colorear con 2 colores:n");
      for (i = 0; i < nodos_max; i++) {
        printf("[%d]t", color[i]);
        }
      printf("n");
    }
    //liberar memoria asignada
    free(visitado);
    free(rear);
    free(padre);
    free(color);
    return;
}

void imprime(double** matriz, int dim) {
  int x, y;

  for (x = 0; x < dim; x++) {//x contador inicial que despliega los valores de
filas de la matriz
for (y = 0; y < dim; y++) {//y contador inicial que despliega las columnas de
la matriz
      printf("%1.2lft ", matriz[x][y]);
    }
    printf("n");
  }

    return;
}

int main(int busqueda, char** anchura) {

    int nodos = SINDEF; // numero de nodos
    int aristas = SINDEF; // 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 = SINDEF; // 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: ");
    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; // guardamos el peso en nuestra matriz
         cont++;
      }
} while(c != 'f');
    assert(aristas == cont);

    // cerramos archivo
    fclose(acceso);

    imprime(pesos, nodos);

    // recorridos
    printf("Define el nodo de inicio: ");
    scanf("%d", &inicio);

  //llamamos a la busqueda en anchura
  bfs(inicio - 1, pesos, nodos); /* aqui damos los valores de ainicio que es
nuestro (nodo -1) debido que en el arreglo empieza en 0
                                    pesos es nuestra matriz de adyacencia que
guarda los valores de las aristas
                                    nodos es el numero total de nodos que tiene el
grafo*/

    for (i = 0; i < nodos; i++) {
      free(pesos[i]);
    }
    free(pesos);

    return 3;
}

More Related Content

What's hot (18)

Java
JavaJava
Java
 
Resumen punteros1
Resumen punteros1Resumen punteros1
Resumen punteros1
 
Cifrado del cesar
Cifrado del cesarCifrado del cesar
Cifrado del cesar
 
Ejercicios de programación.
Ejercicios de programación.Ejercicios de programación.
Ejercicios de programación.
 
criptografiaV1
criptografiaV1criptografiaV1
criptografiaV1
 
Proyecto Poogame Bus
Proyecto Poogame BusProyecto Poogame Bus
Proyecto Poogame Bus
 
Lista enlazada 2 parcial
Lista enlazada 2 parcialLista enlazada 2 parcial
Lista enlazada 2 parcial
 
Ahorcado
AhorcadoAhorcado
Ahorcado
 
08 strings o cadenas
08 strings o cadenas08 strings o cadenas
08 strings o cadenas
 
Informe tecnico
Informe tecnicoInforme tecnico
Informe tecnico
 
Shell
ShellShell
Shell
 
Practica
PracticaPractica
Practica
 
Problema c++
Problema c++Problema c++
Problema c++
 
Ejemplos Importantisimo
Ejemplos  ImportantisimoEjemplos  Importantisimo
Ejemplos Importantisimo
 
Ejercicios resueltos de borland c++
Ejercicios resueltos de borland c++Ejercicios resueltos de borland c++
Ejercicios resueltos de borland c++
 
Código Java Escrito de Forma Estándar
Código Java Escrito de Forma EstándarCódigo Java Escrito de Forma Estándar
Código Java Escrito de Forma Estándar
 
Practicas programacion 1 10
Practicas programacion 1 10Practicas programacion 1 10
Practicas programacion 1 10
 
codigos
codigoscodigos
codigos
 

Similar to Coloreo de grafos (20)

Kruskal
KruskalKruskal
Kruskal
 
Kruskal
KruskalKruskal
Kruskal
 
Kruskal
KruskalKruskal
Kruskal
 
Lab
LabLab
Lab
 
1.2. kotlin (1)
1.2. kotlin (1)1.2. kotlin (1)
1.2. kotlin (1)
 
1.2. kotlin
1.2. kotlin1.2. kotlin
1.2. kotlin
 
PROBLEMAS DE POGRAMACION 1
PROBLEMAS DE POGRAMACION 1PROBLEMAS DE POGRAMACION 1
PROBLEMAS DE POGRAMACION 1
 
Tema3 p2%20
Tema3 p2%20Tema3 p2%20
Tema3 p2%20
 
Informe minishell
Informe minishellInforme minishell
Informe minishell
 
Informe metodos de ordenamiento
Informe metodos de ordenamientoInforme metodos de ordenamiento
Informe metodos de ordenamiento
 
Informe metodos de ordenamiento
Informe metodos de ordenamientoInforme metodos de ordenamiento
Informe metodos de ordenamiento
 
informe unidad 5 -Metodos de ordenamiento-
informe unidad 5 -Metodos de ordenamiento- informe unidad 5 -Metodos de ordenamiento-
informe unidad 5 -Metodos de ordenamiento-
 
Cplus
CplusCplus
Cplus
 
C++
C++C++
C++
 
Programación en c++
Programación en c++Programación en c++
Programación en c++
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Programación de código
Programación de códigoProgramación de código
Programación de código
 
Informe tecnico u 4-victor uex
Informe tecnico u 4-victor uexInforme tecnico u 4-victor uex
Informe tecnico u 4-victor uex
 

Recently uploaded

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 

Recently uploaded (15)

Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 

Coloreo de grafos

  • 1. #include <stdio.h> #include <stdlib.h> #include <assert.h> //valores definidos para verificar los nodos en busqueda #define NO_VISITADO 0 //define que cualquier nodo no visitado este en 0 #define VISITADO 1 //define que cualquier nodo visitado este en 1 //valores definidos para los colores #define SIN_COLOR 1 //valor asignado a los nodos antes de la busqueda en anchura #define COLOR_1 1 #define COLOR_2 2 //valor definido de maximo de caracteres para el archiuvo #define MAX_ARCHIVO 40 //define el tamaño maximo para el archivo #define SINDEF -1 #define SIN_OCUPAR 0 //define a cada valor del arreglo que no este ocupado #define SIN_ARISTA 0.0 //definido para la matriz que pone en 0.0 donde no hay aristas entre nodos #define ROOT -1 void bfs(int nodo, double** aristas_pesos, int nodos_max) { //nodos_max toma sus valores de nodos previamente obtenidos al abrir el archivo .dat int* rear = (int*)malloc(sizeof(int)*nodos_max); int* color = (int*)malloc(sizeof(int)*nodos_max); int* padre = (int*)malloc(sizeof(int)*nodos_max); int* visitado = (int*)malloc(sizeof(int)*nodos_max); int inicio, final, valor_actual_nodo, i = 0, j; //inicio variable de apoyo al iniciar rear, final variable para marcar cuando lleguemos al final de rear int conunter_conflic_color = 0; do{ visitado[i] = NO_VISITADO; rear[i] = SIN_OCUPAR; padre[i] = ROOT; color[i] = SIN_COLOR; i++; }while(i < nodos_max); do { inicio = 0; rear[inicio] = nodo;//se asigna nodo que es del que partimos al inicio de la cola padre[nodo] = ROOT; color[nodo] = COLOR_1;//se le asigna el color 1 al espacio del arreglo color perteneciente a nodo inicial final = 1;//final es el siguiente en la cola do { valor_actual_nodo = rear[inicio++];//asignamos el valor de la cola inicio al valor del nodo actual visitado[valor_actual_nodo] = VISITADO;//asignamos al arreglo de visitado el primer nodo y se marca como visitado if (color[valor_actual_nodo] == SIN_COLOR) { if (color[padre[valor_actual_nodo]] == COLOR_1) { color[valor_actual_nodo] = COLOR_2; } else { color[valor_actual_nodo] = COLOR_1; } }
  • 2. printf("Visitando a nodo %d (color %d).n",valor_actual_nodo + 1, color[valor_actual_nodo]); for (i = 0; i < nodos_max; i++) { if (aristas_pesos[valor_actual_nodo][i] > SIN_ARISTA) { // SIN_ARISTA definido como 0.0 ya que si no hay cambio no hay peso y por lo tanto no hay arista if (visitado[i] == NO_VISITADO) { for (j = inicio; j < final; j++) { if (rear[j] == i) { break; } } if (j == final) { // no se ha visitado rear[final++] = i; padre[i] = valor_actual_nodo; } } else { if (color[valor_actual_nodo] == color[i]) { printf("Hay dos nodos con el mismo color que son vecinos.n"); conunter_conflic_color++; break; }//final de if conflicto de colores }//final de else }//fin de if condicion para saber si es vecino } //fin de for i < que el maximo numero de nodos del grafo } while (inicio < final); if (conunter_conflic_color > 0) { break; } } while (1); if (conunter_conflic_color > 0) { printf("No es un grafo que se pueda colorear con 2 colores:n"); for(i = 0;i < nodos_max;i++){ printf("[%d]t", color[i]); } printf("n"); } else { printf("El grafo se puede colorear con 2 colores:n"); for (i = 0; i < nodos_max; i++) { printf("[%d]t", color[i]); } printf("n"); } //liberar memoria asignada free(visitado); free(rear); free(padre); free(color); return; } void imprime(double** matriz, int dim) { int x, y; for (x = 0; x < dim; x++) {//x contador inicial que despliega los valores de filas de la matriz
  • 3. for (y = 0; y < dim; y++) {//y contador inicial que despliega las columnas de la matriz printf("%1.2lft ", matriz[x][y]); } printf("n"); } return; } int main(int busqueda, char** anchura) { int nodos = SINDEF; // numero de nodos int aristas = SINDEF; // 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 = SINDEF; // 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: "); 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; // guardamos el peso en nuestra matriz cont++; }
  • 4. } while(c != 'f'); assert(aristas == cont); // cerramos archivo fclose(acceso); imprime(pesos, nodos); // recorridos printf("Define el nodo de inicio: "); scanf("%d", &inicio); //llamamos a la busqueda en anchura bfs(inicio - 1, pesos, nodos); /* aqui damos los valores de ainicio que es nuestro (nodo -1) debido que en el arreglo empieza en 0 pesos es nuestra matriz de adyacencia que guarda los valores de las aristas nodos es el numero total de nodos que tiene el grafo*/ for (i = 0; i < nodos; i++) { free(pesos[i]); } free(pesos); return 3; }