{ File: grafeio.pas }

{ Scopo: procedure di lettura e scrittura di grafi etichettati da e su file di
         testo }

procedure LeggiGrafoEticDaFile (var grafo: TipoGrafoEtic;
                                nome_file: TipoNomeFile);
{ Legge da un file di testo un grafo etichettato scritto sotto forma di
  matrice di adiacenza. }
var
  i,j         : TipoNodo;
  val_matrice : TipoEtichettaArco;
  data_file   : text;

begin
  { apri il file in lettura }
  assign(data_file, nome_file);
  reset(data_file);

  { legge la matrice di adiacenza da file }
  for i := 1 to NumNodi do
    for j := 1 to NumNodi do
    begin
      read(data_file, val_matrice);
      if val_matrice <> ArcoNonEsiste then
        InserArcoEtic(grafo, i, j, val_matrice)
      else
        ElimArcoEtic(grafo, i, j)
    end;

  { chiude il file }
  close(data_file)
end; { LeggiGrafoEticDaFile }


procedure ScriviGrafoEticSuFile (var grafo: TipoGrafoEtic;
                                 nome_file: TipoNomeFile);
var
  i,j         : TipoNodo;
  val_matrice : TipoEtichettaArco;
  data_file   : text;

begin
  { apri il file in scrittura }
  assign(data_file, nome_file);
  rewrite(data_file);

  { scrivi la matrice sul file }
  for i := 1 to NumNodi do
  begin
    for j := 1 to NumNodi do
    begin
      EtichettaArco(grafo, i, j, val_matrice);
      write(val_matrice,' ')
    end;
    writeln(data_file);
  end;
  close(data_file)
end; { ScriviGrafoSuFile }


procedure StampaGrafoEtic (var grafo: TipoGrafoEtic);
var
  i,j       : TipoNodo;
  etichetta : TipoEtichettaArco;

begin
  { per tutti i nodi }
  for i := 1 to NumNodi do
  begin
    write(i:2, ': ');
    { visuallizza la lista dei nodi successori }
    for j := 1 to NumNodi do
      if TestEsisteArcoEtic(grafo, i, j) then
      begin
        EtichettaArco(grafo, i, j, etichetta);
        write('- ', etichetta:5:2, '-> ', j)
      end;
    writeln
  end
end; { StampaGrafoEtic }