Rappresentazione di grafi

Questa lezione ha come obiettivo la reppresentazione di grafi pesati.

Seguire i seguenti passi implementativi:

  1. Creare una classe Graph che rappresenta un grafo pesato. La classe deve contenere i seguenti campi:
    • public String type: tipo del grafo (diretto o indiretto);
    • public int nodes: numero di nodi;
    • public int edges: numero di archi;
    • public int[][] adj: vettori di adiacenza;
    • public int[][] cost: vettori dei costi;
    e i seguenti metodi:
    • public Graph (String file). Costruttore: carica un grafo leggendolo dal file passato. Il file passato contiene la rappresentazione GraphViz del grafo in cui i nodi sono numerati da 1 a n. Segue un esempio di grafo indiretto:
      graph G {
       1 -- 3 [label = "3"];
       1 -- 4 [label = "5"];
       2 -- 3 [label = "7"];
       2 -- 4 [label = "9"];
      }
      
      Segue un esempio di grafo diretto:
      digraph DG {
       1 -> 3 [label = "3"];
       1 -> 4 [label = "5"];
       2 -> 3 [label = "7"];
       2 -> 4 [label = "9"];
      }
      
    • public String toString(). Restituisce una stringa che contiene la rappresentazione GraphViz del grafo.
    • public void toFile(String file). Salva in file la rappresentazione GraphViz del grafo.

Nota

Si consiglia di usare vettori estendibili (in particolare, la classe ArrayList<E>) quando non sono noti a priori il numero di nodi o il numero di archi del grafo (ad esempio in fase di lettura del grafo da file) oppure per grafi dinamici che possono essere estesi con nuovi nodi e nuovi archi. In tutti gli altri casi usare grafi statici, rappresentati mediante una matrice sfilacciata di interi (un vettore di vettori di dimensioni variabili). Quest'ultima rappresentazione risulta pił efficiente della soluzione dinamica.

Laboratorio di ASD - Massimo Franceschet