karlangadas

bipartito con listas

Dec 2nd, 2016
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.35 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "todo.h"
  4. #define MAX 20
  5. /*
  6. int Lista_Insertar2(TLista *L, TElemento e,int tipo){
  7.     if (!Lista_EstaEnLista(*L,e)){
  8.         TNodo *nodo = malloc(sizeof(TNodo));
  9.         nodo->elem=e;
  10.         nodo->tipo=tipo;
  11.         nodo->sig=NULL;
  12.         if (Lista_EstaVacia(*L)){
  13.             L->inicio = nodo;
  14.         }
  15.         else{
  16.             L->fin->sig = nodo;
  17.         }
  18.         L->fin = nodo;
  19.         (L->numElem)++;
  20.         return 1;
  21.     }
  22.  
  23.     TNodo *crtNodo= L->inicio;
  24.     while(crtNodo!=NULL && crtNodo->elem != e)
  25.         crtNodo=crtNodo->sig;
  26.     return (crtNodo->tipo==tipo);
  27.    
  28. }
  29. */
  30. int bipartito(TGrafo *g);
  31. void EncolarLista(TLista *visit,TCola *C,TLista *L, int tipo);
  32.  
  33. int tipo=0;
  34. int correcto=1;
  35. int main(){
  36.      TGrafo G;
  37.     grafo_init(&G);
  38.     grafo_insertV(&G,1);
  39.     grafo_insertV(&G,2);
  40.     grafo_insertV(&G,3);
  41.     grafo_insertV(&G,4);
  42.    
  43.     grafo_insertA(&G,1,2);
  44.     grafo_insertA(&G,1,3);
  45.     //grafo_insertA(&G,2,3);
  46.     grafo_insertA(&G,2,4);
  47.     grafo_insertA(&G,3,4);    
  48.    
  49.     if (bipartito(&G))
  50.         printf("Es bipartito\n");
  51.     else
  52.         printf("No es bipartito\n");
  53.    
  54. }
  55.  
  56.  
  57. int  bipartito(TGrafo *g){
  58.     //Colas
  59.     TCola porvisitar;
  60.     TLista visitados;
  61.     C_init(&porvisitar);
  62.     Lista_Crear(&visitados);
  63.    
  64.     TVertice *rec=g->ini;
  65.     TNodo *crt=visitados.inicio;
  66.     TElemento crtVert;
  67.    
  68.     //Buscamos el vértice
  69.     C_enqueue(&porvisitar,g->ini->info);
  70.     int tipo=0;
  71.     Lista_Insertar2(&visitados,g->ini->info,tipo);
  72.     while(!C_isEmpty(&porvisitar)){
  73.         crtVert=C_dequeue(&porvisitar);
  74.  
  75.         rec=g->ini;
  76.         while (rec && rec->info!=crtVert)
  77.             rec=rec->sig;
  78.  
  79.         crt=visitados.inicio;
  80.         while (crt && crt->elem!=crtVert)
  81.           crt=crt->sig;
  82.        
  83.         EncolarLista(&visitados,&porvisitar,&rec->lstAdyacentes,crt->tipo);
  84.         if (!correcto)
  85.             return 0;
  86.  
  87.     }
  88.    
  89.     return 1;
  90. }
  91.  
  92. void EncolarLista(TLista *visit,TCola *C,TLista *L, int tipo){
  93.    
  94.     TNodo *crtnode=L->inicio;
  95.    
  96.     while (crtnode){
  97.         if (!Lista_EstaEnLista(*visit,crtnode->elem))
  98.             C_enqueue(C,crtnode->elem);
  99.            
  100.         correcto=Lista_Insertar2(visit,crtnode->elem,!tipo);
  101.         if (!correcto)
  102.             break;
  103.         crtnode=crtnode->sig;
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment