Schema generale, visita in ampiezza e profondità.

Slides:



Advertisements
Presentazioni simili
Master Bioinformatica 2002: Grafi Problema: cammini minimi da tutti i vertici a tutti i vertici Dato un grafo pesato G =(V,E,w), trovare un cammino minimo.
Advertisements

Breath-first search Visita in ampiezza di un grafo Algoritmo Esempio
Breath-first search Visita in ampiezza di un grafo Algoritmo Esempio
Esercizi su alberi binari
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Ordinamento topologico Cammino minimo dalla sorgente
Alberi di copertura minimi. Dato un grafo pesato G = (V,E), si richiede di trovare un albero T = (V,E’), E’  E, tale che la somma dei pesi associati.
Olimpiadi di Informatica 2010 Giornate preparatorie
Algoritmi elementari su grafi
Master Bioinformatica 2002: Visite di Grafi La struttura dati D è una PILA (STACK) Visita in profondità o Depth-First-Search (DFS)
Master Bioinformatica 2002: Visite di Grafi Algoritmi di visita Scopo: visitare tutti i vertici di un grafo per scoprirne proprietà di vario tipo. Alcune.
Grafi: rappresentazione e visita
Capitolo 11 Grafi e visite di grafi Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Prof.ssa Rossella Petreschi Lezione del 3 /12/ 2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 3 del testo Nishizeki,Chiba “Planar graphs:theory.
Prog21 Alberi binari (radicati e ordinati) Il figlio destro della radice La radice Il figlio sinistro della radice Il padre del nodo 5.
Algoritmi di Visita di Grafi Moreno Marzolla
Cammini minimi Moreno Marzolla
Prof.ssa Rossella Petreschi Lezione del 3/12/2013 del Corso di Algoritmica GRAFI e PLANARITA’ Lezione n°15.
Algoritmi Avanzati a.a.2013/2014 Prof.ssa Rossella Petreschi Somme prefisse Lezione n°2.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Cammini minimi in grafi:
Branch and Bound Lezione n°19 Prof.ssa Rossella Petreschi
GRAFI e PLANARITA’ Lezione n°19 Prof.ssa Rossella Petreschi
Branch and Bound Lezione n°14 Prof.ssa Rossella Petreschi
La funzione Path e le forme a cespuglio
Alberi binari Definizione Sottoalberi Padre, figli
Lezione n°15 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Cammini minimi tra tutte le coppie
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Algoritmi Avanzati Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Usi (meno scontati) della visita DFS
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
K4 è planare? E K3,3 e K5 sono planari? Sì!
Algoritmi e Strutture Dati
per rappresentare grafi
Lezione n°11 Prof.ssa Rossella Petreschi
Lezione n°12 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
ABBINAMENTO Lezione n°13
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
Algoritmi per il flusso nelle reti
Scrivere programmi corretti
Algoritmi e Strutture Dati
Introduzione agli Algoritmi e alle Strutture Dati
Alberi n-ary Lezioni di C.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Usi (meno scontati) della visita DFS
Algoritmi Avanzati Prof.ssa Rossella Petreschi
comprensione e modifica di codice
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
Backtracking Lezione n°17 Prof.ssa Rossella Petreschi
APPUNTI SUL LINGUAGGIO C Alberi Binari – primi esercizi
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Cammini minimi in grafi:
Grafi e problem solving
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Insiemi disgiunti.
Algoritmi e Strutture Dati
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Algoritmi.
Transcript della presentazione:

Schema generale, visita in ampiezza e profondità. Visita di Grafi Schema generale, visita in ampiezza e profondità.

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.

Grafi: rappresentazione (1) Matrici di incidenza: 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

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

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}).

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

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.

Partizioni per una visita (2) G Esterno Interno Frontiera

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; Nota: una copertura di un insieme di vertici X è un albero i cui vertici includano X.

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?

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

Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 1 Albero =

Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 2 4 Albero = 2 4

Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 5 Albero = 2 4 5

Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera = 3 6 Albero = 2 4 5 3 6

Visita in ampiezza esempio. 1 2 3 4 5 6 1 Frontiera =  Albero = 2 4 5 3 6

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?

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

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 1

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 2 1 2

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 5 2 1 2 5

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 3 5 2 1 2 5 3

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 5 2 1 2 5 3

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 6 5 2 1 2 5 3 6

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 5 2 1 2 5 3 6

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 2 1 2 5 3 6

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 1 2 5 3 6

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 4 1 4 2 5 3 6

Visita in profondità esempio. 1 2 3 4 5 6 1 Albero = Frontiera = 1 4 2 5 3 6

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

Fine