Grafi. ASD - Grafi2 Definizioni/1 Rappresentazione di relazioni binarie G=(V,E), |V|=n, |E|=m V:...

of 42 /42
Grafi

Embed Size (px)

Transcript of Grafi. ASD - Grafi2 Definizioni/1 Rappresentazione di relazioni binarie G=(V,E), |V|=n, |E|=m V:...

  • Slide 1
  • Grafi
  • Slide 2
  • ASD - Grafi2 Definizioni/1 Rappresentazione di relazioni binarie G=(V,E), |V|=n, |E|=m V: insieme di Vertici E={(v i, v j ): v i, v j V} : insieme di Archi (v i, v j )=(v j, v i ): Grafo semplice (v i, v j ) (v j, v i ): Grafo diretto
  • Slide 3
  • ASD - Grafi3 Esempi Relazioni di parentela Alberi genealogici Relazioni tra classi nei linguaggi OO Grafo del Web Assetti societari Reti di trasporto................
  • Slide 4
  • ASD - Grafi4 Definizioni/2 Multigrafo: E un multinsieme Pseudografo: E contiene anche coppie (v i, v i ) cappi Circuito in un grafo: v 1,v 2,..,v k :(v i, v i+1 ) E, v 1 = v k Ciclo in un grafo: circuito con v 1 v 2 .. v k Grafo pesato: valore reale w k associato ad ogni arco e k
  • Slide 5
  • ASD - Grafi5 Definizioni/3 K n : Grafo semplice in cui sono presenti tutti gli archi. Numero di archi in K n : G=(V,E) sottografo di G=(V,E) se e solo se V V ed E E. grado(v): #di archi incidenti in v
  • Slide 6
  • ASD - Grafi6 Esempi di grafi: (a-d) grafi semplici; (c) un grafo completo K4; (e) un multigrafo; (f) uno pseudografo; (g) un circuito in un grafo orientato; (h) un ciclo nel grafo orientato
  • Slide 7
  • ASD - Grafi7 Rappresentazioni Lista di adiacenza: ogni vertice associato con la lista dei vertici adiacenti. Lista di adiacenza pu essere una tabella o una lista concatenata Matrice di adiacenza: a ih =1 se (v i, v h ) E, a ih =0 altrimenti Matrice di Incidenza: a ih =1 se v i e h, a ih =0 altrimenti
  • Slide 8
  • ASD - Grafi8 Rappresentazioni di grafi. Un grafo (a) rappresentato con una lista di adiacenze (b-c),
  • Slide 9
  • ASD - Grafi9 Rappresentazioni di grafi. Un grafo (a) rappresentato come una matrice di adiacenze (d) e come una matrice dincidenza (e)
  • Slide 10
  • ASD - Grafi10 Vantaggi e Svantaggi Lista di adiacenza: O(m) Vantaggi: permette di scorrere i nodi adiacenti a v in O(grado(v)) Svantaggi: inserimenti e cancellazioni su liste concatenate in O(grado(v)) Matrice di adiacenza: O(n 2 ) Vantaggi: Inserimenti e cancellazioni in O(1) Svantaggi: permette di scorrere i nodi adiacenti a v in O(n) D.: matrice di incidenza ?
  • Slide 11
  • ASD - Grafi11 Visita di un Grafo Obiettivo: visitare una sola volta tutti i nodi del grafo. Es.: visitare un porzione del grafo del Web Difficolt: Presenza di cicli Presenza di nodi isolati
  • Slide 12
  • ASD - Grafi12 Visita in profondit - DFS La visita procede da tutti gli archi uscenti da un nodo. Se tutti i nodi adiacenti sono stati visitati allora si torna al nodo predecessore. Una volta tornati al nodo di partenza si prosegue da un nodo qualsiasi non visitato. I nodi vengono rinumerati secondo lordine di visita.
  • Slide 13
  • ASD - Grafi13 Esempio di applicazione dellalgoritmo depthFirstSearch ad un grafo
  • Slide 14
  • ASD - Grafi14 Lalgoritmo depthFirstSearch applicato ad un grafo orientato
  • Slide 15
  • ASD - Grafi15 Implementazione della DFS/1 I nodi sono inizialmente marcati con 0, i=0. Assumi la visita sia arrivata ad un nodo v. La visita prosegue da un nodo u adiacente a v se marcato 0. Se nessun nodo adiacente marcato 0 disponibile torna al nodo da cui si raggiunto v oppure termina se v il nodo iniziale. Ogni volta che un nodo mai visitato raggiunto, questo viene marcato con i++
  • Slide 16
  • ASD - Grafi16 Implementazione della DFS/2 depthFirstSearch() { for (tutti i vertici v) num(v)=fin(v)=0; / Vedi slide seg. */ edges = null; i=j=1; /* Servono per aggiornare num(v) e fin(v) */ while ( ) DFS(v); }
  • Slide 17
  • ASD - Grafi17 Implementazione della DFS/3 DFS(v) { num(v)=i++; /* num(v): prima volta che si visita v */ for ( ) if (num(u) == 0) { DFS(u); } fin(v)=j++; /* fin(v): ultima volta che si visita v */ }
  • Slide 18
  • ASD - Grafi18 Implementazione della DFS/4 Limplementazione iterativa usa una pila per memorizzare gli archi uscenti da un nodo visitato. Ad ogni passo si estrae larco (v,u) sulla cima della pila. La visita prosegue dal nodo adiacente u se marcato 0.
  • Slide 19
  • ASD - Grafi19 Propriet della DFS Gli archi che portano alla scoperta di nuovi nodi costituiscono un albero che copre lintero grafo Questa propriet dipende dal fatto che un arco viene seguito solo se il nodo adiacente non mai stato raggiunto. Gli archi seguiti connettono un nodo con marca inferiore ad un nodo con marca superiore Gli archi che non vengono seguiti al contrario connettono nodi con marca superiore a nodi con marca inferiore
  • Slide 20
  • ASD - Grafi20 Complessit della DFS O(n) per inizializzare marcatura dei nodi. Test degli archi uscenti da un nodo v: O(grado(v)) nella rappresentazione con lista di adiacenza. O(n) nella rappresentazione con matrice di adiacenza. Ogni controllato al pi due volte, una volta per estremo Complessivamente O(n + m)
  • Slide 21
  • ASD - Grafi21 Visita in ampiezza - BFS uso di una coda per memorizzare tutti gli archi incidenti nel nodo visitato I nodi vengono marcati. La visita quindi procede dallarco (v,u) in testa alla coda.
  • Slide 22
  • ASD - Grafi22 Implementazione della BFS breadthFirstSearch() { for (tutti i vertici v) num(v)=0; edges= null; i=1; while ( ) { num(v) = i++; enqueue(v); while ( ) { v = dequeue(); for ( ) if num(u) = 0 { num(u) = i++; enqueue(u); } }
  • Slide 23
  • ASD - Grafi23 Un esempio di applicazione dellalgoritmo breadthFirstSearch ad un grafo
  • Slide 24
  • ASD - Grafi24 Applicazione dellalgoritmo breadthFirstSearch ad un grafo orientato
  • Slide 25
  • ASD - Grafi25 Implementazione di Grafi/Vertici class Vertex { String vertexName; long vertexWeight; public Vertex(String name, long weight) { vertexName = name; vertexWeight = weight; } public Vertex() { this(null, (long) 0); }
  • Slide 26
  • ASD - Grafi26 Esempio: generico elemento del vettore dei vertici /* Generico elemento del vettore dei vertici. Contiene un vertice e la lista di adiacenza del vertice */ class adListElement { Vertex vertex; LinkedList adList; public adListElement(Vertex v, LinkedList l) { vertex = v; adList = l; } public adListElement() { this(null, null); }
  • Slide 27
  • ASD - Grafi27 Esempio: classe Grafo public class Grafo { protected static final int NO_NODES = 10; protected adListElement vertexArray[] = new adListElement[NO_NODES]; /* Gestisce grafi con no. nodi costante. Se si vuole un grafo il cui no. di nodi sia variabile occorre usare una lista invece di un array */ /* Continua alla prossima slide */ /* Nota: questa una classe minima */
  • Slide 28
  • ASD - Grafi28 Esempio: classe Grafo/2 public Grafo(String inputFile) { /* Costruisce un grafo a partire da una sua rappresentazione su memoria secondaria del tipo:.....\n */ } /* Continua */
  • Slide 29
  • ASD - Grafi29 Esempio: classe Grafo/3 public void dijkstra(String sorg, String dest) { /* Trova percorso minimo tra i vertici aventi nome sorg e dest del grafo usando l'algoritmo di Dijkstra. Stampa i nomi dei nodi del percorso in successione */ } /* Continua */
  • Slide 30
  • ASD - Grafi30 Esempio: classe Grafo/4 public void dfs(String start) { /* Visita in profondit il grafo partendo dal nodo di nome start. Stampa i nomi dei nodi nell'ordine di attraversamento */ } } /* Fine della classe */
  • Slide 31
  • ASD - Grafi31 Connettivit in Grafi diretti u,v sono connessi in un grafo orientato se esiste un cammino diretto che collega u a v Un grafo diretto fortemente connesso se per ogni coppia u,v, esiste un cammino da u a v e da v ad u Un grafo debolmente connesso se per ogni coppia u,v, esiste un cammino da u a v (o viceversa)
  • Slide 32
  • ASD - Grafi32 Il problema dei Cammini Minini/2 Determinare il cammino di lunghezza minima dal nodo s al nodo t dal nodo s a tutti gli altri nodi V (SSSP) tra tutte le coppie di nodi del grafo (APSP) Numerose applicazioni: reti stradali, reti di comunicazione, scheduling di progetti, progetto di circuiti,.
  • Slide 33
  • ASD - Grafi33 Il Problema dei Cammini Minimi G=(V,E) un grafo pesato sugli archi d(u,v), (u,v) E: peso sullarco (u,v) Cammino dal nodo s al nodo t: v 1, v 2,.., v k : (v i, v i+1 ) E, v 1 = s, v k =t Lunghezza del cammino: Trovare un cammino di lunghezza minima Non contiene cicli per distanze positive
  • Slide 34
  • ASD - Grafi34 Single Source Shortest Paths/1 Determinare il cammino minimo da un nodo s a tutti i nodi V del grafo Ogni sottocammino di un cammino minimo esso stesso un cammino minimo. Ex: s,,i,j,,v: cammino minimo da s a v i,,j un cammino minimo da i a j. Come si dimostra?
  • Slide 35
  • ASD - Grafi35 Single Source Shortest Paths/2 La collezione dei cammini minimi da s a tutti i nodi V forma un albero. Come si dimostra? Algoritmi per SSSP mantengono ad ogni istante delle etichette sui nodi. Etichette rappresentano delle approssimazioni delle distanze dalla sorgente.
  • Slide 36
  • ASD - Grafi36 Dijkstra/1 1.Due insiemi di nodi Q ed R. 2.Inizialmente Q= {}, R={1,..,n} 3. 4.Ad ogni passo estrai il nodo v in R con min dist(v) ed inserisci v in Q 5.Per ogni u adiacente a v aggiorna la distanza da s ad u attraverso nodi in Q Nota: dist(v) indica la distanza di v dalla sorgente s
  • Slide 37
  • ASD - Grafi37 Unesecuzione di DijkstraAlgorithm
  • Slide 38
  • ASD - Grafi38 Dijkstra/2 DijkstraAlg(grafo_semplice_pesato, vertice source) { for ( ) dist(v)= ; dist(source)=0; R = ; Q = ; while (R!=) { v = R = R {v}; Q = Q U {v}; for ( ) if (dist(u) > dist(v) + d(v,u)) { dist(u) = dist(v) + d(v,u); pred(u) = v; }
  • Slide 39
  • ASD - Grafi39 Dijkstra/3 Ad ogni passo si determina la distanza minima di un nodo v in R. Il nodo viene inserito in Q. Dijkstra termina in n passi. Ad ogni passo occorre determinare il nodo v in R con minimo valore dist(v), O(log n) usando un heap per la coda di priorit. Occorre poi eseguire il rilassamento per ogni adiacente u di v, O(grado(u)) vertici, ed eventualmente aggiornare la priorit. Complessivamente O(m log n) Complessit di Dikstra O((n + m )log n).
  • Slide 40
  • ASD - Grafi40 Dijkstra/4 Correttezza: Dimostrare che dist(v) la distanza minima d(v) da v ad s quando v incluso in Q. Per assurdo, considera il primo nodo inserito in Q per cui d(v) < dist(v) Esiste un cammino alternativo pi breve che contiene almeno un nodo in R. Sia v lultimo nodo in R sul cammino da v a s. v connesso ad s con un cammino formato di soli nodi in Q con dist(v) < dist(v). Una contraddizione poich v sarebbe stato selezionato in luogo di v.
  • Slide 41
  • ASD - Grafi41 Dijkstra/5 La collezione dei pred(u) forma lalbero dei cammini minimi con sorgente s. Si pu risolvere il problema APSP eseguento n volte Dijkstra a partire da n sorgenti. Complessit:O(nlog n(m +n)).
  • Slide 42
  • ASD - Grafi42 Animazione disponibile a: http://www.cs.uwa.edu.au/underg raduate/courses/230.300/readi ngs/graphapplet/graph.html