1 / 31

Grafi: rappresentazione e visita

Grafi: rappresentazione e visita. Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro. Grafi: definizione. Un grafo diretto ( orientato ) è una coppia G =  V , A  dove V è un insieme (non vuoto) di vertici A  V  V è un insieme, eventulamente vuoto, di archi. 1. 2.

fallon
Télécharger la présentation

Grafi: rappresentazione e visita

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Grafi: rappresentazione e visita Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro AloLab - Grafi

  2. Grafi: definizione • Un grafo diretto (orientato) è una coppia G = V, A dove • V è un insieme (non vuoto) di vertici • A V V è un insieme, eventulamente vuoto, di archi. 1 2 V = {1,2,3,4} A = 1,2,1,3, 3,2, 2,4 3 4 G si dice pesato se esiste una funzione peso:A. G non è diretto se A è un insieme di coppie non ordinate. AloLab - Grafi

  3. Grafi: rappresentazione (1) Matrici di adiacenza:M rappresenta G = V,A se M è una matrice n n, dove n = |V|, e (ponendo ogni elemento di V in corrispondenza con un intero tra 1 e n): 1 se i,j  A Mi,j = 0 altrimenti Nel caso di grafi pesati si pone Mi,j = peso(i,j) se i,j  A,  altrimenti. 1 2 3 4 AloLab - Grafi

  4. Grafi: rappresentazione (2) Liste di adiacenza:G = V,A è rappresentato da un vettore v[1..n] di liste su V, tale che n = |V|, ad ogni vertice in V sia associato un indice in 1..n, e j occorra nella lista v[i] se e solo se i,j  A. Nel caso di grafi pesati le liste hanno elementi in V, e j,r occorre nella lista v[i] se e solo se i,j  A e peso(i,j) = r. 1 2 1 2 3 2 4 3 2 3 4 4 AloLab - Grafi

  5. Cammini • Dato un qualunque insieme di coppie (relazione binaria) R, la chiusura transitiva di R, R*, è il piu piccolo insieme di coppie tale che: • i) R  R*, ii) se x,y, y,z  R*, allora x,z  R*. • Si osservi che la definizione è ricorsiva: un modo alternativo è • R0 = , • Rn+1 = R {x,z | x,y  Rn, y,z  R}, • R* = • Un cammino in un grafo G = V, A è un elemento della chiusura transitiva A* di A: quindi un cammino è una sequenza finita di archi, •  = a,b, b,c, … , y,z • che si dice un cammino da a a z, la cui lunghezza è pari al numero degli archi che lo compongono (lunghezza() = min{n |  An}). AloLab - Grafi

  6. Visita di un grafo Una visita di un grafo G = V, A è un insieme di cammini in G con origine in uno stesso stesso vertice. Una visita è dunque un albero, i cui vertici sono contenuti in V ed i cui archi sono contenuti in A (è un sottografo di G), la cui radice è l’origine dei cammini. 1 1 2 1 3 2 3 3 4 2 4 4 AloLab - Grafi

  7. Partizioni per una visita (1) • Un vertice j è adiacente ad i se i,j  A. • Per implementare un algoritmo di visita si considerano due partizioni dei vertici del grafo: una partizione in visitati e non visitati; ed una partizione nei tre sottoinsiemi: • frontiera (GRIGIO): insieme dei vertici visitati che possono avere altri vertici adiacenti non ancora visitati; • interno (NERO): insieme dei vertici visitati i vertici adiacenti sono stati visitati; • esterno (BIANCO): insieme dei vertici non ancora visitati. AloLab - Grafi

  8. Partizioni per una visita (2) v G Esterno Interno Frontiera AloLab - Grafi

  9. Pseudocodifica degli algoritmi di visita: schema generale Function visita_grafo (grafo G = V, A, vertice v): insieme; varalbero, interno, esterno, frontiera, D, visitato: insieme; begin esterno := V / {v}; frontiera := {v}; interno := ; albero := ; visitato := {v}; whilefrontieradobegin {Inv. interno, frontiera, esterno soddisfano le rispettive definizioni e, se interno ha almeno due vertici allora albero è una copertura di interno } sia wfrontiera; D : {u |w,u  Aanduesterno}; visitato := visitato D; ifD = thenbegin frontiera := frontiera / {w}; interno:= interno {w}; end elsefoareachuDdobegin esterno:= esterno / {u}; frontiera:= frontiera {u}; albero := albero{w,u} endforeach endif endwhile return albero endfunction; AloLab - Grafi

  10. Visita in ampiezza (BFS) La visita procede aggiungendo alla frontiera tutti i vertici esterni adiecenti ad un vertice nella frontiera; fatto questo il vertice considerato viene rimosso dalla frontiera ed aggiunto ai vertici interni. La scelta di D è: D := {uw,uAanduesterno} per qualche w in frontiera. La frontiera è costituita da una sequenza di vertici la cui distanza da v è non decrescente: il primo elemento è il più vicino a v. Quale struttura dati può implementare la frontiera? AloLab - Grafi

  11. Algoritmo BFS BFS (grafo G = V, A, vertice v) varinterno, esterno, albero : insieme; frontiera: coda; interno := ; albero := ; esterno:= V/{v} Accoda(v,frontiera); while frontiera   do u := EstraiDallaCoda(frontiera); foreach w s.t. u,wAandw esterno do esterno = esterno / {w}; albero := albero {u,w} Accoda(w,frontiera); interno := interno {u} return albero AloLab - Grafi

  12. Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 1 Albero = AloLab - Grafi

  13. Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 2 4 Albero = 2 4 AloLab - Grafi

  14. Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 5 Albero = 2 4 5 AloLab - Grafi

  15. Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 3 6 Albero = 2 4 5 3 6 AloLab - Grafi

  16. Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera =  Albero = 2 4 5 3 6 AloLab - Grafi

  17. Visita in profondità (DFS) La scelta di D è: D := {u}, per qualche u tale che esiste w  frontiera , w è l’ultimo vertice inserito e w,u  A. La frontiera è un cammino che comincia da v; l’ultimo vertice aggiunto alla frontiera è il primo ad essere considerato: sia per aggiungere altri vertici, sia per rimuoverlo dalla frontiera. Con quale struttura conviene implementare la frontiera? AloLab - Grafi

  18. Algoritmo DFS-Visit DFS-Visit (grafo G = V, A, vertice v) varinterno, esterno, albero : insieme; frontiera: pila; interno := ; albero := ; esterno:= V/{v} Push(v,frontiera); while frontiera   do u := Top(frontiera); D := {w | u,wAandw esterno} if D then with w D do esterno = esterno / {w}; albero := albero {u,w} Push(w,frontiera); elseinterno := interno {u}; Pop(frontiera); return albero AloLab - Grafi

  19. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 1 AloLab - Grafi

  20. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 2 1 2 AloLab - Grafi

  21. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 5 2 1 2 5 AloLab - Grafi

  22. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 3 5 2 1 2 5 3 AloLab - Grafi

  23. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 5 2 1 2 5 3 AloLab - Grafi

  24. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 6 5 2 1 2 5 3 6 AloLab - Grafi

  25. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 5 2 1 2 5 3 6 AloLab - Grafi

  26. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 2 1 2 5 3 6 AloLab - Grafi

  27. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 1 2 5 3 6 AloLab - Grafi

  28. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 4 1 4 2 5 3 6 AloLab - Grafi

  29. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 1 4 2 5 3 6 AloLab - Grafi

  30. Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera =  4 2 5 3 6 AloLab - Grafi

  31. Fine AloLab - Grafi

More Related