Il TDA Graph. Definizione. Note 1. Interfacce Vertex ed Edge

Documenti analoghi
Definizione. Un grafo è una coppia (V, E), dove

L' ADT grafo è un contenitore di elementi memorizzati nelle posizioni del grafo (vertici e archi)

Il TDA Graph. Definizione. Esempio. Grafi pesati e non. Grafi direzionati e non. Metodi di accesso del TDA Graph. Un grafo è una coppia (V, E), dove

Il TDA Map. Tabelle hash

Definizione informale. Il TDA Map memorizza coppie formate da una chiave k e da un valore v. La coppia è chiamata entry. Ogni chiave deve essere unica

Il TDA Map. Definizione informale. I metodi del TDA Map 2. I metodi del TDA Map 1. Interfaccia Map 1 NO_SUCH_KEY. Tabelle hash

Il TDA List è la versione orientata agli oggetti della struttura dati lista. Una sequenza di nodi

List. Il TDA List. Interfaccia Position. Il TDA Position. Il TDA List 1. Ancora su Position

Alberi. In informatica, un albero è un modello astratto di una struttura dati gerarchica

TDA Position (TDA List Sequence)

Parte di laboratorio

Introduzione ai Grafi: Implementazione e operazioni di base

Laboratorio di Algoritmi e Strutture Dati

Il TDA Dictionary. Definizione informale. I metodi del TDA Dictionary 1. Applicazioni. I metodi del TDA Dictionary 2. I metodi del TDA Dictionary 3

Definizione informale

Definizione informale. Il TDA Dictionary (dizionario) modella una collezione di voci su cui è possibile effettuare delle ricerche

Albero in cui ogni nodo ha al più due figli. I figli di un nodo costituiscono una coppia ordinata

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi. Albero binario. Un albero binario è un albero (ordinato) in cui ciascun nodo può avere al massimo due figli (figlio destro e figlio sinistro)

Esercitazione 7. Grafi. Rappresentazione e algoritmi di visita

Algoritmi e Strutture di Dati

Laboratorio 9 ( Java 4 ) Classe astratta per BFS su grafo

Gerarchie e polimorfismo: liste

Il TDA Tree. Alberi. Esempio. Alberi. Applicazioni. Definizione di albero

Metodo di costruzione di un albero di copertura minimo

Esercizi Union-Find e su Grafi. Ugo Vaccaro

Liste doppie. Doubly Linked Lists. GT: 6.2 (e 3.3) Argomenti della lezione

E` un tipo astratto di dati che supporta tutti i metodi dell'adt Array list e dell'adt Lista di nodi più i seguenti:

tipi di dato astratti

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

tipi di dato astratti

Implementazione Algoritmo Esponenziale per Vertex Cover

LINKEDLIST: implementazione iteratore. LINKEDLIST: iteratore INNERITERATOR INNERITERATOR

algoritmi e strutture di dati

Informatica 3. LEZIONE 25: Algoritmi sui grafi. Modulo 1: Problema del percorso più breve Modulo 2: Spanning tree a costo minimo

GRAFI. Cosa sono Grafi non orientati Grafi orientati Grafi pesati Alberi Automi!

Esercizio. Strutture Dati

LABORATORIO DI ALGORITMI E STRUTTURE DATI A-L. Ingegneria e scienze informatiche Cesena A.A: 2016/2017 Docente: Greta Sasso

Esercizio: Lista Circolare

Implementazione ADT: Alberi

ADT Mappa. Le chiavi (il mezzo per accedere agli elementi) hanno lo scopo di rendere efficiente la ricerca. Strutture Dati

LABORATORIO DI ALGORITMI E STRUTTURE DATI A-L. Ingegneria e scienze informatiche Cesena A.A: 2016/2017 Docente: Greta Sasso

Una breve introduzione all implementazione in C di algoritmi su grafo

Parte I Java. Metodologie di Programmaziona Secondo Appello, 14/2/2006 1

Implementazione con alberi binari di ricerca

Coda a doppio ingresso (Deque)

Alberi Binario in Java

Tipi di dati astratti

Il tipo astratto di dati Node List

Coda a doppio ingresso (Deque)

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

GRAFI. Angelo Di Iorio Università di Bologna

Grafi: visite. Una breve presentazione. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Progettazione del Software Anno Accademico

Programmazione in Java Parte II

Soluzioni della settima esercitazione di Algoritmi 1

Laboratorio di Algoritmi e Strutture Dati

Ingegneria degli Algoritmi (II parte pratica)

SET: specifica INTRODUZIONE. SET: esempio Si stampano i numeri casuali in ordine di generazione e il contenuto dell insieme.

Collezioni, mappe e iteratori (a cura del Prof. Marco Patella)

Introduzione al Java Collections Framework. Progettazione del Software Anno Accademico Interfacce del Collections Framework

Implementazione della coda con liste concatenate. x v. il front della coda è memorizzato nel primo nodo (head) della lista

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A

Progettazione di Algoritmi Anno Accademico Esercizi su Grafi: Parte Prima

Conoscere l uso delle collezioni in Java. Conoscere il concetto di Generics (programmazione

Esercitazione 6 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016

Generics & Collections

Alberi Binari Alberi Binari

Cammini Minimi. Algoritmo di Dijkstra. Cammino in un grafo

Informatica 3. LEZIONE 24: Grafi. Modulo 1: Rappresentazione e implementazione di grafi Modulo 2: Attraversamento di un grafo

Esercizi proposti per il corso di Strutture Dati

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

1 TEORIA DELLE RETI 1. 1 Teoria delle reti. 1.1 Grafi

La classe java.lang.object

Heap e Code di Priorità

Le gerarchie di tipi: implementazioni multiple e principio di sostituzione

Graf. Progettazione di Algoritmi a.a Matricole congrue a 1. Docente: Annalisa De Bonis. Grafi non direzionati

Algoritmi e Strutture Dati

Cammini Minimi. Algoritmo di Dijkstra

Grafi pesati Minimo albero ricoprente

Introduzione ai Grafi di LEDA

Scope e visibilità per classi

Esercitazione 5 Alberi Binari di Ricerca

Grafi: definizioni e visite

Alberi e alberi binari I Un albero è un caso particolare di grafo

COMPLEMENTI DI SHORTEST-PATH. ASD Fabrizio d'amore

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Alberi e alberi binari I Un albero è un caso particolare di grafo

Fondamenti di informatica T-1 (A K) Esercitazione 9: array

Grafi: introduzione. Definizioni: che cosa sono i grafi. Definizione

Lezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I {

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Metodi di una Collection

ALGORITMI E STRUTTURE DATI

TIPO DI DATO ASTRATTO

Sommario della lezione

Appunti lezione Capitolo 13 Programmazione dinamica

Transcript:

Il TDA Graph Definizione Un grafo è una coppia (V, E), dove V è un insieme di elementi, chiamati vertici (nodi) E è un insieme di coppie di nodi, chiamati archi Nella nostra implementazione, vertici ed archi sono posizioni e memorizzano elementi Saranno rappresentati dalle interfacce Vertex e Edge Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 2 Interfacce Vertex ed Edge public interface Vertex extends Position{ public interface Edge extends Position{ Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 3 Note element nell implementazione di Vertex l elemento potrà rappresenterà il nome del vertice element nell implementazione di Edge l elemento contenuto rappresenterà Il nome dell arco, ad esempio (u,v), oppure il peso dell arco Tramite il design pattern Decorator possiamo aggiungere una qualsiasi proprietà (attributo) a Edge e Vertex Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 4

Note 2 Rappresenteremo i grafi pesati e quelli non pesati nello stesso modo Rappresenteremo i grafi direzionati e quelli non direzionati nello stesso modo Cambierà l interfaccia per accedere alla rappresentazione del grafo Nel caso di grafo orientati, ad esempio, vogliamo conoscere il numero degli archi entranti e quello degli archi uscenti Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 5 Metodi di accesso del TDA Graph isempty() numvertices() restituisce il numero di vertici del grafo numedges() restituisce il numero di archi del grafo endvertices(e): Restituisce un array contenente i due vertici dell arco e opposite(v, e) Restituisce il vertice incidente sull arco e opposto al vertice v areadjacent(v, w) Restituisce true se e solo i vertici v e w sono Prof. Carlo adiacenti Blundo Laboratorio di Algoritmi e Strutture Dati 6 Metodi di aggiornamento del TDA Graph replace(v, x) Sostituisce l elemento presente nel vertice v con x replace(e, x) Sostituisce l elemento presente nell arco e con x insertvertex(x) Inserisce un vertice che memorizza l elemento x insertedge(v, w, x) Inserisce l arco (v,w) che memorizza l elemento x removevertex(v) Cancella il vertice v ed i suoi archi incidenti removeedge(e) Cancella l arco e Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 7 Metodi che restituiscono iteratori incidentedges(v) Restituisce un iteratore sugli archi incidenti su v vertices() Restituisce un iteratore sui vertici nel grafo edges() Restituisce un iteratore sugli archi nel grafo outedges(v) Restituisce un iteratore sugli archi uscenti da v Si applica solo ai grafi direzionati inedges(v) Restituisce un iteratore sugli archi entranti in v Si applica solo ai grafi direzionati Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 8

Gerarchie di interfacce Tutti i metodi vengono suddivisi in una gerarchia di interfacce così come abbiamo fatto per gli alberi Alcuni metodi verranno inseriti nell implementazione delle posizioni Edge e Vertex e richiamati nell implementazione di Graph Il codice relativo alle interfacce è sul sito InspectableContainer InspectablePositionalContainer PositionalContainer InspectableGraph Graph InspectableDirectedGraph UndirectedGraph DirectedGraph Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 9 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 0 InspectableGraph public interface InspectableGraph extends InspectablePositionalContainer { public boolean isempty(); //restituisce il numero di vertici del grafo public int numvertices(); InspectableGraph 2 //restituisce un vertice arbitrario del grafo public Vertex avertex(); //restituisce un arco arbitrario del grafo public Edge anedge(); //restituisce un iteratore sugli archi del grafo public Iterator edges(); //restituisce il numero di archi del grafo public int numedges(); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati //restituisce true se v e v2 sono adiacenti public boolean areadjacent(vertex v, Vertex v2); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 2

InspectableGraph 3 InspectableGraph 4 //restituisce il grado del vertice v public int degree(vertex v); //restituisce un iteratore sui vertici adiacenti al vertice v public Iterator adjacentvertices(vertex v); //restituisce un iteratore sugli archi incidenti sul vertice v public Iterator incidentedges(vertex v); //restituisce un array di grandezza due contenente // i vertici incidenti su e public Vertex[] endvertices(edge e); //restituisce l'estremità di e distinta da v // (l'altro vertice incidente su e) public Vertex opposite(vertex v, Edge e); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 3 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 4 Graph public interface Graph extends PositionalContainer, InspectableGraph { // Inserisce un vertice isolato nel grafo che // contiene element public Vertex insertvertex(object element); // Inserisce un arco contenente element tra i vertici v // e v2. Se il grafo è orientato v è l'origine e v2 è la // destinazione public Edge insertedge (Vertex v, Vertex v2, Object element); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 5 Graph 2 //Cancella il vertice v e tutti gli archi incidenti su esso public void removevertex(vertex v); //Cancella l'arco e public void removeedge(edge e); //Cancella l'arco tra i nodi v e v2 public void removeedge(vertex v, Vertex v2); //Sostituisce l'elemento in v con x public void replace(vertex v, Object x); //Sostituisce l'elemento in e con x public void replace(edge e, Object x); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 6

UndirectedGraph public interface UndirectedGraph extends Graph { Le interfacce InspectableDirectedGraph e DirectedGraph sono a disposizione sul sito Aggiungere tutte le eccezioni necessarie Implementazioni di Edge e Vertex Le loro implementazioni cambiano a seconda della rappresentazione che utilizzeremo per il grafo Lista di Incidenza (Incidence List) Matrice delle Adiacenze (Adjacent Matrix) Lista delle Adiacenze (Adjacent List) Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 7 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 8 Lista di incidenza Il grafo è rappresentato tramite due liste Una lista V (NodeList) conserva i vertici del grafo All interno di una posizione nella lista c è una posizione che rappresenta il vertice Una lista E (NodeList) conserva gli archi del grafo Per rappresentare l insieme dei vertici e l insieme degli archi avremmo potuto utilizzare un contenitore qualsiasi Implementazione di Vertex L implementazione di Vertex conserva sia l elemento contenuto nel vertice sia il riferimento alla posizione che conserva il vertice nella sequenza dei vertici v a u b c u v w z In questo modo alcune operazioni (e.g., remove(v)) saranno semplificate w d z Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 9 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 20

Inserire il riferimento alla posizione? Nell implementazione di Vertex (Edge) si potrebbe inserire un riferimento alla posizione del contenitore (NodeList) che conserva, come elemento, il vertice (l arco) L implementazione di alcuni metodi sarà più efficiente ILVertex DNode Object element; ILVertex Position.. DNode pos; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 2 La classe ILVertex È la nostra implementazione di Vertex per i grafi rappresentati attraverso una lista di incidenza Per semplicità, usiamo la stessa rappresentazione sia per i grafi direzionati sia per quelli non direzionati I vertici dei grafi direzionati hanno outdegree e indegree Avremmo potuto avere una classe base da cui poi derivavamo le classi che rappresentano il vertice di un grafo non direzionato e quelli di uno direzionato Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 22 La classe ILVertex public class ILVertex implements Vertex { protected Object _element; La classe ILVertex 2 public ILVertex() { (String) _element = new String(); public ILVertex(Object o) { _element = o; protected int indegree; //serve solo per i grafi direzionati protected int outdegree; public Object element() { return _element; public Object setelement(object o) { Object tmp = _element; _element = o; return tmp; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 23 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 24

La classe ILVertex 3 public int indegree() { return indegree; public int setindegree(int d) { indegree = d; return indegree; public int outdegree() { return outdegree; public int setoutdegree(int d) { outdegree = d; return outdegree; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 25 Implementazione di Edge L implementazione di Edge contiene L elemento Un riferimento al vertice origine Un riferimento al vertice destinazione Un riferimento alla posizione che conserva l arco nella sequenza degli archi NodeList Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 26 v a a u b c u v w z w d b c d z UEdge È la nostra implementazione di Edge Rappresenta un arco non direzionato La classe DEdge, rappresenta l arco direzionato, sarà derivata da UEgde e Verranno aggiunti solo dei metodi specifici per un arco direzionato Implementazione di UEdge public class UEdge implements Edge { protected Object _element; protected Vertex _origin; protected Vertex _destination; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 27 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 28

Implementazione di UEdge 2 public UEdge () { (String) _element = new String(); public UEdge (Object o) { _element = o; public Object element () { return _element; public Object setelement (Object o) { Object tmp = _element; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 29 Implementazione di UEdge 3 public void setendpoints (Vertex v, Vertex v2) { _origin = v; _destination = v2; public Vertex[] endpoints () { Vertex[] ep = new ILVertex[2]; ep[0] = _origin; ep[] = _destination; return ep; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 30 Implementazione di UEdge 4 public Vertex oppostite(vertex v) { if(v.equals(_origin)) return _destination; else if(v.equals(_destination)) return _origin; else throw new Errore("L'arco non è incidente al vertice"); Esercizio Aggiungere equals alla classe ILVertex Implementare la classe DEdge Aggiungere getorigin(); getdestination(); reversedirection(); setdirectionfrom(vertex v); setdirectionto(vertex v); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 3 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 32

Implementazione del TDA Graph Solo per semplicità, implementeremo separatamente le intefacce UndirectedGraph e DirectedGraph scrivendo le classi ILUndirectedGraph e ILDirectedGraph La cosa migliore da fare sarebbe quella di implementare una gerarchia di classi raggruppando le funzionalità comuni ai due tipi di grafi così come abbiamo fatto per le interfacce Le classi al top di questa gerarchia dovrebbero essere classi astratte Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 33 ILUndirectedGraph È la classe che implementa l interfaccia UndirectedGraph Si basa sulle liste di incidenza (NodeList) Una per i vertici Una per gli archi L implementazione fornita è parziale, completarla per esercizio Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 34 Bozza della classe public class ILUndirectedGraph implements UndirectedGraph { NodeList _vertices; NodeList _edges; public ILUndirectedGraph() { _vertices = new NodeList(); _edges = new NodeList(); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 35 Alcuni metodi public int numvertices() { return _vertices.size(); public int numedges() { return _edges.size(); public int degree(vertex v) { ILVertex tmp = checkvertex(v); return tmp.indegree(); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 36

Alcuni metodi 2 public Vertex avertex() throws GraphEmptyException { if(_vertices.size()) return (Vertex) (_vertices.first()).element(); else throw new GraphEmptyException( Grafo vuoto ); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 37 Nota Nell implementazione di ILUndirectedGraph aggiungere le funzioni checkedge e checkvertex Sono simili a checkposition di NodeList Verificano che la posizione Vertex o Edge passata è valida Convertono una posizione generica Vertex o Edge al tipo ILVertex o UEdge, rispettivamente, eseguendo un cast, se non ci riescono lanciano un eccezione Bisogna stabilire quando una posizione (Vertex ed Edge) non è valida Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 38 Iteratori Nelle interfacce precedenti sono previsti dei metodi che restituiscono un iteratore Possiamo gestire iteratori su archi e vertici implementando due classi VertexIterator EgdeIterator Entrambe implementano Iterator Per l implementazione utilizzeremo un Adapter Pattern Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 39 VertexIterator EdgeIterator public class VertexIterator implements Iterator {.. public Vertex nextvertex() {. public class EdgeIterator implements Iterator {.. public Edge nextedge() {. Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 40

VertexIterator public class VertexIterator implements Iterator { private Iterator V_iter; public VertexIterator (Iterator iter) { V_iter = iter; public boolean hasnext () { return V_iter.hasNext(); public Object next () {return V_iter.next(); public Vertex nextvertex () { Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 4 Utilizzo di VertexIterator public Iterator vertices() { return new VertexIterator(_vertices.elements()); L implementazione di public Iterator adjacentvertices(vertex v); non è immediata come quella di vertices() Come è possibile implementare vertices()? Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 42 elements() e positions() La nostra gerarchia di interfacce prevede i metodi elements() e positions() Come distinguiamo archi da vertici? Cosa dovremmo far restituire a tali metodi? Solo archi; solo vertici; archi e vertici Come esercizio provate a fornire una possibile soluzione Per il momento ignorate questi metodi (fate restituire un iteratore vuoto) Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 43 Algoritmi su grafi Ci sono degli algoritmi su grafi che hanno bisogno di associare delle informazioni ai vertici e/o archi del grafo BDF Campi: predecessore, colore e distanza MST Pesi sugli archi Campi: predecessore e chiave Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 44

Mappe e grafi Mappe e grafi 2 Invece di aggiungere altri campi nell implementazione di un vertice (arco), aggiungiamo solo un istanza della classe che implementa Map La mappa associata al vertice (arco) conterrà delle informazioni aggiuntive (attributi) sul nodo che possono essere inserite a seconda dell algoritmo che utilizzerà il grafo Le chiavi della mappa saranno essere stringhe tipo: colore, distanza, genitore, Dobbiamo estendere la classe che implementa il vertice aggiungendo Un istanza di Map Dei metodi per leggere/settare le proprietà del vertice (arco) Questo è il design pattern Decorator Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 45 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 46 Interfaccia Decorable public interface Decorable { //assegna il valore value all attributo attr lancia // un eccezione se l attributo non è del tipo giusto public void set (Object attr, Object value) throws InvalidAttributeException; //restituisce il valore associato all attributo attr lancia //un eccezione se attr non esiste o non è del tipo giusto public Object get (Object attr) throws InvalidAttributeException; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 47 Interfaccia Decorable 2 //rimuove l attributo attr, lancia un eccezione se attr //non è del tipo giusto public Object destroy (Object attr) throws InvalidAttributeException; //restituisce true se se l attributo attr esiste, lancia //un eccezione se attr non è del tipo giusto public boolean has (Object attr) throws InvalidAttributeException; //restituisce un iteratore sugli attributi public Iterator attributes (); Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 48

Classe DecoratedILVertex Classe DecoratedILVertex 2 public class DecoratedILVertex extends ILVertex implements Decorable { Map m; public DecoratedILVertex () { m = HashTableSCMap(); public DecoratedILVertex (Equality Tester eq) { m = HashTableSCMap(eq); public boolean has (Object attr) throws InvalidAttributeException { checkattribute(attr); if(m.get(attr) == null) return false; else return true; Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 49 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 50 Altre implementazioni per i grafi Altre rappresentazioni per grafi Se il grafo fosse rappresentato tramite una lista delle adiacenze, allora l implementazione di Vertex potrebbe contenere un riferimento ad un contenitore che memorizza i vertici adiacenti al vertice stesso Per rappresentare i grafi potremmo utilizzare La lista delle adiacenze La matrice delle adiacenze Non rispecchiano esattamente le strutture viste nella lezione sui grafi Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 5 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 52

Lista delle adiacenze Lista dei vertici Sequenza di posizioni che rappresentano i vertici Ogni vertice contiene un riferimento ad un contenitore di posizioni che rappresentano gli archi Lista degli archi Sequenza di posizioni che rappresentano gli archi (non i vertici!!!) I(u) a u a I(u) è la lista delle adiacenze del vertice u v u v w I(v) b w I(w) b Riferimento ai contenitori Anche con questa rappresentazione la classe che rappresenta il vertice conserva sia l elemento contenuto nel vertice sia il riferimento alla posizione che contiene il vertice nella sequenza dei vertici Lo stesso vale per la classe che rappresenta l arco, inoltre la classe conserva i riferimenti alle posizioni nei contenitori dove è presente l arco Per l arco (u,v) vengono conservati i riferimenti alle posizioni nei contenitori I(u) ed I(v) Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 53 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 54 Implementazione tramite lista delle adiacenze Nella classe che implementa Vertex possiamo aggiungere altre informazioni utili Le informazioni presenti in ILVertex Due contenitori (e.g., NodeList) uno contenente riferimenti agli archi uscenti, l altro riferimento agli archi entranti Nella classe che implementa Edge aggiungiamo Riferimenti ai vertici su cui l arco insiste Matrice delle adiacenze Lista degli archi Come per il caso precedente Lista dei vertici Sequenza di posizioni che rappresentano i vertici Ogni vertice contiene una chiave intera (indice) Matrice di adiacenza Contiene, per vertici adiacenti, un riferimento alle posizioni che rappresentano gli archi Contiene null per vertici non adiacenti u a v 0 u v 2 w a 0 2 0 b 2 w b Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 55 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 56

Lista di Incidenza Lista delle Adiacenze Matrice delle Adiacenze Esercizi Spazio incidentedges(v) areadjacent (v, w) insertvertex(o) n + m m m n + m deg(v) min(deg(v), deg(w)) n 2 n n 2 Implementare l interfaccia DirectedGraph rappresentando il grafo con: Una lista di incidenza insertedge(v, w, o) removevertex(v) removeedge(e) m deg(v) n 2 Implementare le interfacce UndirectedGraph e DirectedGraph rappresentando il grafo con: Una lista delle adiacenze Una matrice delle adiacenze n = # nodi m = #archi Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 57 Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 58 Esercizi Implementare gli algoritmi: BFS e DFS MST Prim e Kruskal Dijkstra Ford-Fulkerson Prof. Carlo Blundo Laboratorio di Algoritmi e Strutture Dati 59