Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. UNIT uGrafoEstatica;
  2.  
  3. INTERFACE
  4.     USES uElem,uConj,uCola;
  5.  
  6.     CONST
  7.         MAX = 5;
  8.  
  9.     TYPE
  10.         TAlmacen = RECORD
  11.             e:TElem;
  12.             b:boolean;
  13.  
  14.         END;
  15.  
  16.         TMatriz = ARRAY[1..MAX , 1..MAX] OF integer;
  17.  
  18.         TVector = ARRAY [1..MAX] OF TAlmacen;
  19.  
  20.         TGrafo = RECORD
  21.             matriz:TMatriz;
  22.             vector:TVector;
  23.             tope:0..MAX;
  24.  
  25.         END;
  26.  
  27.     PROCEDURE CrearGrafoVacio (VAR grafo:TGrafo);
  28.  
  29.     PROCEDURE Insertar (VAR grafo:TGrafo; e:TElem);
  30.  
  31.     PROCEDURE InsertarArco (VAR grafo:TGrafo; o,d:TElem);
  32.  
  33.     PROCEDURE Pertenece (vector:TVector; VAR bo:boolean; VAR po:1..MAX);
  34.  
  35.     PROCEDURE EliminarVertice (VAR grafo:TGrafo; e:TElem);
  36.  
  37.     PROCEDURE EliminarArco (VAR grafo:TGrafo; o,d:TElem);
  38.  
  39.     PROCEDURE RecorridoAnchura (grafo:TGrafo);
  40.  
  41. IMPLEMENTATION
  42.  
  43.     PROCEDURE CrearGrafoVacio (VAR grafo:TGrafo);
  44.         VAR
  45.             i,j:0..MAX
  46.         BEGIN
  47.  
  48.             FOR i:=1 TO MAX DO
  49.                 FOR j:=1 TO MAX DO
  50.                     grafo.matriz[i,j] := 0;
  51.  
  52.             FOR i:=1 TO MAX DO
  53.                 grafo.vector[i].b := FALSE;
  54.  
  55.             grafo.tope := 0;
  56.         END;
  57.  
  58.     PROCEDURE Insertar (VAR grafo:TGrafo; e:TElem);
  59.         VAR
  60.             b:boolean;
  61.             p:0..MAX;
  62.         BEGIN
  63.             p := 0;
  64.             Pertenece(e,grafo.vector,grafo,b,p);
  65.             IF (grafo.tope < MAX) AND (b=FALSE) THEN
  66.                 BEGIN
  67.                     grafo.tope := grafo.tope + 1;
  68.  
  69.                     grafo.vector[grafo.tope].b := TRUE;
  70.  
  71.                     Asignar(grafo.vector[grafo.tope].e , e);
  72.  
  73.                 END;
  74.         END;
  75.  
  76.     PROCEDURE InsertarArco (VAR grafo:TGrafo; o,d:TElem);
  77.         VAR
  78.             pos,pos2:1..MAX;
  79.             b,b2:boolean;
  80.         BEGIN
  81.             pos := 0;
  82.             pos2 := 0;
  83.  
  84.             Pertenece(o,grafo.vector,grafo,b,pos);
  85.             Pertenece(d,grafo.vector,grafo,b2,pos2);
  86.  
  87.             IF (b) AND (b2) THEN
  88.                 BEGIN
  89.                     grafo.matriz[pos,pos2] := 1;
  90.                 END;
  91.         END;
  92.  
  93.     PROCEDURE Pertenece (elem:TElem; vector:TVector; grafo:TGrafo; VAR bo:boolean; VAR po:1..MAX);
  94.         VAR
  95.             i:1..MAX;
  96.         BEGIN
  97.  
  98.             bo := FALSE;
  99.  
  100.             IF grafo.tope<>0 THEN
  101.                 BEGIN
  102.                     i := 1;
  103.                     WHILE (i<=grafo.tope) AND (bo=FALSE) DO
  104.                         BEGIN
  105.                             bo := ( Iguales(vector[i].e , elem) ) AND (vector[i].b);
  106.                             i := i+1;
  107.                         END;
  108.                     po := i;
  109.                 END;
  110.         END;
  111.  
  112.     PROCEDURE EliminarVertice (VAR grafo:TGrafo; e:TElem);
  113.         VAR
  114.             p:0..MAX;
  115.             b:boolean;
  116.             i:1..MAX;
  117.         BEGIN
  118.             p := 0;
  119.  
  120.             Pertenece(e,grafo.vector,grafo,b,p);
  121.  
  122.             IF b THEN
  123.                 BEGIN
  124.                     grafo.vector[p].b := FALSE;
  125.  
  126.                     FOR i:=1 TO grafo.tope DO
  127.                         BEGIN
  128.                             grafo.matriz[p,i] := 0;
  129.                             grafo.matriz[i,p] := 0;
  130.  
  131.                         END;
  132.                 END;
  133.         END;
  134.  
  135.     PROCEDURE EliminarArco (VAR grafo:TGrafo; o,d:TElem);
  136.         VAR
  137.             b,b2:boolean;
  138.             p,p2:0..MAX;
  139.         BEGIN
  140.             Pertenece(o,grafo.vector,grafo,b,p);
  141.             Pertenece(d,grafo.vector,grafo,b2,p2);
  142.  
  143.             IF b AND b2 THEN
  144.                 grafo.matriz[p,p2] := 0;
  145.         END;
  146.  
  147.     PROCEDURE RecorridoAnchura (grafo:TGrafo);
  148.         VAR
  149.             conjR,conjV,conjD:TConj;
  150.             i,po:integer;
  151.             bo:boolean;
  152.             elem:TElem;
  153.         BEGIN
  154.             CrearConjuntoVacio(conjV);
  155.             CrearConjuntoVacio(conjR);
  156.             FOR i=1 TO MAX DO
  157.                 BEGIN
  158.                     IF grafo.vector[i].b=TRUE THEN
  159.                         Poner(conjV,grafo.vector[i].e);
  160.                 END;
  161.  
  162.             i:=1;
  163.             WHILE (grafo.vector[i].b<>FALSE) AND (i<=grafo.tope) DO
  164.                 BEGIN
  165.                     i := i+1;
  166.                 END;
  167.  
  168.             IF grafo.vector[i].b = TRUE THEN
  169.                 BEGIN
  170.                     Mostrar(grafo.vector[i].e);
  171.                     Poner(conjR,grafo.vector[i].e);
  172.  
  173.                     CrearColaVacia(cola);
  174.  
  175.  
  176.  
  177.                     FOR j:=1 TO grafo.tope DO
  178.                         BEGIN
  179.                             IF grafo.matriz[i,j]=1 THEN
  180.                                 InsertarCola(cola,grafo.vector[j].e);
  181.  
  182.                         END;
  183.  
  184.  
  185.                     WHILE NOT(EsColaVacia(cola)) DO
  186.                         BEGIN
  187.                             PrimeroCola(cola,elem);
  188.  
  189.                             Mostrar(elem);
  190.  
  191.                             Poner(conjR,elem);
  192.  
  193.                             po := 0;
  194.                             Pertenece(elem,grafo.vector,grafo,bo,po);
  195.  
  196.                             FOR j:=1 TO grafo.tope DO
  197.                                 BEGIN
  198.                                     IF (grafo.matriz[po,j]=1) AND NOT(uCola.Pertenece(cola,grafo.vector[j].e)) THEN
  199.                                         InsertarCola(cola,grafo.vector[j].e);
  200.                                 END;
  201.  
  202.  
  203.                             uCola.Quitar(cola);
  204.  
  205.  
  206.                         END;
  207.  
  208.                 END;
  209.  
  210.  
  211.         END;
  212.  
  213. END.