{ File: grafemat.pas }

{ Scopo: rappresentazione di grafi etichettati tramite matrice di adiacenza }

{ Le dichiarazioni per grafi etichettati richiedono le definizione preliminari

const
  NumNodi       = ...;
  ArcoNonEsiste = ...; costante di TipoEtichettaArco

type
  TipoEtichettaArco = ...;
  TipoEtichettaNodo = ...;
}

type
  TipoNodo      = 1..NumNodi;
  TipoGrafoEtic = record
                    matr_adiacenza : array [TipoNodo, TipoNodo] of TipoEtichettaArco;
                    etichette_nodi : array [TipoNodo] of TipoEtichettaNodo
                  end;

{ Grafo Etichettato }

procedure InitGrafoEtic (var grafo: TipoGrafoEtic);
{ Inizializza un grafo etichettato. }
var
  i,j : TipoNodo;
begin
  for i := 1 to NumNodi do
    for j := 1 to NumNodi do
      grafo.matr_adiacenza[i,j] := ArcoNonEsiste
end; { InitGrafoEtic }


function TestEsisteArcoEtic (var grafo: TipoGrafoEtic; i,j: TipoNodo): boolean;
{ Verifica l'esistenza di un arco in un grafo etichettato. }
begin
  TestEsisteArcoEtic := (grafo.matr_adiacenza[i,j] <> ArcoNonEsiste)
end; { TestEsisteArcoEtic }


procedure InserArcoEtic (var grafo : TipoGrafoEtic;
                         i,j       : TipoNodo;
                         etichetta : TipoEtichettaArco);
{ Inserisce un arco con una certa etichetta in un grafo etichettato. }
begin
  grafo.matr_adiacenza[i,j] := etichetta
end; { InserArcoEtic }


procedure ElimArcoEtic (var grafo: TipoGrafoEtic; i,j: TipoNodo);
{ Elimina un arco da un grafo etichettato. }
begin
  grafo.matr_adiacenza[i,j] := ArcoNonEsiste
end; { ElimArcoEtic }


procedure EtichettaArco (var grafo     : TipoGrafoEtic;
                         i, j          : TipoNodo;
                         var etichetta : TipoEtichettaArco);
{ Restituisce l'etichetta di un arco in un grafo etichettato. }
begin
  etichetta := grafo.matr_adiacenza[i,j]
end; { EtichettaArco }


procedure AssegnaEtichettaNodo (var grafo : TipoGrafoEtic;
                                i         : TipoNodo;
                                etichetta : TipoEtichettaNodo);
{ Modifica l'etichetta di un nodo in un grafo etichettato. }
begin
  grafo.etichette_nodi[i] := etichetta
end; { AssegnaEtichettaNodo }


procedure EtichettaNodo (var grafo     : TipoGrafoEtic;
                         i             : TipoNodo;
                         var etichetta : TipoEtichettaNodo);
{ Restituisce l'etichetta di un nodo in un grafo etichettato. }
begin
  etichetta := grafo.etichette_nodi[i]
end; { EtichettaNodo }