karlangadas

BFS DFS grafos

Nov 19th, 2016
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "todo.h"
  4.  
  5. void ApilarLista(TGrafo *g, TLista *visit,TPila *P,TLista *L);
  6. void DFS(TGrafo *g,TElemento verticeIni);
  7. void EncolarLista(TLista *visit,TCola *C,TLista *L);
  8. void BFS(TGrafo *g,TElemento verticeIni);
  9. void DFSRecursivo(TGrafo *g,TPila *porvisitar,TLista *visitados);
  10.  
  11. int main(){
  12.     TGrafo G;
  13.     grafo_init(&G);
  14.     grafo_insertV(&G,'a');
  15.     grafo_insertV(&G,'b');
  16.     grafo_insertV(&G,'c');
  17.     grafo_insertV(&G,'d');
  18.     grafo_insertV(&G,'e');
  19.     grafo_insertV(&G,'f');
  20.     grafo_insertV(&G,'g');
  21.    
  22.     grafo_insertA(&G,'a','d');
  23.     grafo_insertA(&G,'a','c');
  24.     grafo_insertA(&G,'a','b');
  25.     grafo_insertA(&G,'a','e');
  26.     grafo_insertA(&G,'f','d');
  27.     grafo_insertA(&G,'f','b');
  28.     grafo_insertA(&G,'g','e');
  29.     grafo_insertA(&G,'g','c');
  30.     grafo_insertA(&G,'d','b');
  31.     grafo_print(&G);
  32.     BFS(&G,'a');
  33.     DFS(&G,'a');
  34.     return 0;
  35. }
  36.  
  37. void BFS(TGrafo *g,TElemento verticeIni){
  38.     //Colas
  39.     TCola porvisitar;
  40.     TLista visitados;
  41.     C_init(&porvisitar);
  42.     Lista_Crear(&visitados);
  43.    
  44.     TVertice *rec=g->ini;
  45.     TElemento crtVert;
  46.    
  47.     //Buscamos el vértice
  48.     C_enqueue(&porvisitar,verticeIni);
  49.     while(!C_isEmpty(&porvisitar)){
  50.         crtVert=C_dequeue(&porvisitar);
  51.         Lista_Insertar(&visitados,crtVert);
  52.         rec=g->ini;
  53.         while (rec && rec->info!=crtVert)
  54.             rec=rec->sig;
  55.         EncolarLista(&visitados,&porvisitar,&rec->lstAdyacentes);
  56.     }
  57.     Lista_Imprimir(visitados);
  58. }
  59.  
  60. void EncolarLista(TLista *visit,TCola *C,TLista *L){
  61.    
  62.     TNodo *crtnode=L->inicio;
  63.     while (crtnode){
  64.         if (!Lista_EstaEnLista(*visit,crtnode->elem)){
  65.             C_enqueue(C,crtnode->elem);
  66.             Lista_Insertar(visit,crtnode->elem);
  67.         }
  68.         crtnode=crtnode->sig;
  69.     }
  70. }
  71.  
  72. void DFS(TGrafo *g,TElemento verticeIni){
  73.     //Pilas
  74.     TPila porvisitar;
  75.     TLista visitados;
  76.     Stack_Create(&porvisitar);
  77.     Lista_Crear(&visitados);
  78.     Stack_Push(&porvisitar,verticeIni);
  79.     DFSRecursivo(g,&porvisitar,&visitados);
  80.  
  81.     Lista_Imprimir(visitados);
  82. }
  83.  
  84. void DFSRecursivo(TGrafo *g,TPila *porvisitar,TLista *visitados){
  85.     TVertice *rec=g->ini;
  86.     TElemento crtVert;
  87.     int i=0;
  88.     while(!Stack_IsEmpty(*porvisitar)){
  89.         crtVert=Stack_Top(*porvisitar);
  90.         Lista_Insertar(visitados,crtVert);
  91.         rec=g->ini;
  92.         while (rec && rec->info!=crtVert)
  93.             rec=rec->sig;
  94.         ApilarLista(g,visitados,porvisitar,&rec->lstAdyacentes);
  95.         Stack_Pop(porvisitar);
  96.     }
  97. }
  98.  
  99. void ApilarLista(TGrafo *g, TLista *visit,TPila *P,TLista *L){
  100.     TNodo *crtnode=L->inicio;
  101.     while (crtnode){
  102.         if (!Lista_EstaEnLista(*visit,crtnode->elem)){
  103.             Stack_Push(P,crtnode->elem);
  104.             Lista_Insertar(visit,crtnode->elem);
  105.             DFSRecursivo(g,P,visit);
  106.         }
  107.         crtnode=crtnode->sig;
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment