Scaricare la presentazione
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)
G v Esterno Interno Frontiera AloLab - Grafi
9
Pseudocodifica degli algoritmi di visita: schema generale
Function visita_grafo (grafo G = V, A, vertice v): insieme; var albero, interno, esterno, frontiera, D, visitato: insieme; begin esterno := V / {v}; frontiera := {v}; interno := ; albero := ; visitato := {v}; while frontiera do begin {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 A and u esterno}; visitato := visitato D; if D = then begin frontiera := frontiera / {w}; interno:= interno {w}; end else foareach u D do begin 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 A and u 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)
var interno, 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 A and w 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)
var interno, esterno, albero : insieme; frontiera: pila; interno := ; albero := ; esterno:= V/{v} Push(v,frontiera); while frontiera do u := Top(frontiera); D := {w | u,w A and w esterno} if D then with w D do esterno = esterno / {w}; albero := albero {u,w} Push(w,frontiera); else interno := 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 = 2 5 AloLab - Grafi
22
Visita in profondità esempio.
1 2 3 4 5 6 1 Albero = Frontiera = 2 5 3 AloLab - Grafi
23
Visita in profondità esempio.
1 2 3 4 5 6 1 Albero = Frontiera = 2 5 3 AloLab - Grafi
24
Visita in profondità esempio.
1 2 3 4 5 6 1 Albero = Frontiera = 2 5 3 6 AloLab - Grafi
25
Visita in profondità esempio.
1 2 3 4 5 6 1 Albero = Frontiera = 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
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.