330 likes | 434 Views
Usi ( meno scontati ) della visita DFS. Informazioni utili : tenere il tempo. pre(v ) =clock clock=clock+1. post(v)=clock; clock=clock+1. clock=1. pre(v): tempo in cui viene “ scoperto ” v post(v): tempo in cui si “ abbandona ” v.
E N D
Informazioniutili: tenereil tempo pre(v)=clock clock=clock+1 post(v)=clock; clock=clock+1 clock=1 pre(v): tempo in cui viene “scoperto” v post(v): tempo in cui si “abbandona” v
quando non tuttiinodisonoraggiungibilidalpuntodipartenza • VisitaDFS (grafoG) • for eachnodovdo impostav come non marcato • clock=1 • F forestavuota • for eachnodovdo • if (v è non marcato) then • T alberovuoto • visitaDSFRicorsiva(v,T) • aggiungiT ad F • returnF
Un esempio 1 16 2 11 12 15 13 14 4 7 3 10 8 9 5 6 pre(v)post(v) v
proprietà per ognicoppiadinodi u e v, gliintervalli [pre(u),post(u)] e [pre(v),post(v)] o sonodisgiunti o l’uno è contenutonell’altro u è antenatodi v nell’albero DFS, se pre(u) < pre(v) < post(v) < post(u) condizionecherappresentiamocosì: possiamousarei tempi divisita per riconoscereiltipodi un genericoarco (u,v) del grafo?
…riconoscerei tipi diarco pre/post per l’arco(u,v) tipodiarco in avanti all’indietro trasversali
riconoscere la presenzadi un ciclo in un grafodiretto Algoritmo: faiunavisita DFS e controlla se c’è un arcoall’indietro Proprietà Un grafodirettoG ha un ciclo se e solo se la visita DFS rivela un arcoall’indietro. (): se c’èarcoall’indietro, chiaramenteG ha un ciclo (): se c’èciclo <v0,v1, …, vk=v0> sia vi è il primo nodoscopertonellavisita vitermina la visitadopoche vi+1ha terminatola sua vi+1termina la visitadopoche vi+2ha terminatola sua vitermina la visitadopoche vi-1ha terminatola sua allora(vi-1,vi) è un arcoall’indietro
Definizione Un grafodirettoaciclico (DAG) è un grafodirettoGche non contienecicli (diretti). Definizione Un ordinamentotopologicodi un grafodirettoG=(V,E) è unafunzionebiettiva:V {1,2,..,n} tale che per ogniarco (u,v) E, (u)<(v) pozzo: solo archiuscenti sorgente: solo archiuscenti
Teorema Un grafodirettoGammette un ordinamentotopologico se e solo se G è un DAG dim () per assurdo: sia un ordinamentotopologicodiG e sia <v0,v1, …, vk=v0> un ciclo allora(v0) < (v1) <…< (vk-1) <(vk)=(v0) (): …adessodiamo un algoritmocostruttivo.
calcolareordinamentotopologico Algoritmo: faiunavisita DFS e restituisciinodi in ordinedecrescenterispettoai tempi di fine visita post(v) Complessitàtemporale: se G è rappresentato con liste di adiacenza Θ(n+m) • OrdinamentoTopologico (grafoG) • top=n; L listavuota; • chiamavisita DFS ma: • quandohaifinitodivisitare un nodov (quandoimposti post(v)): • (v)=top; top=top-1; • aggiungi v in testaallalista L • returnL e
Un esempio 11 12 2 1 10 3 C A 3 8 5 4 7 6 2 9 4 pre(v)post(v) (v) E D B v 5 6 7 G F 13 14 1 F C A B D E G
correttezza per ognicoppiadinodi u e v, gliintervalli [pre(u),post(u)] e [pre(v),post(v)] o sonodisgiunti o l’uno è contenutonell’altro pre/post per l’arco(u,v) tipodiarco in avanti non cipossonoesserearchiall’indietro all’indietro trasversali
Un algoritmoalternativo (*) (*) perchéaltrimenti in Ĝogniverticedeveaverealmeno un arcoentrante, e quindipossotrovare un ciclopercorrendoarchientranti a ritroso, e quindiG non puòessereaciclico) Tempo di esecuzione (con liste di adiacenza): Θ(n+m) (dimostrare!)
Un esempio C A E D B G F
Un esempio C A E D B G F
Un esempio A E D B G F C
Un esempio E D B G F C A
Un esempio E D G F C A B
Un esempio E G F C A B D
Un esempio G F C A B D E
Un esempio F C A B D E G
Un esempio C A E D B G F F C A B D E G
unacomponentefortementeconnessadi un grafoG=(V,E) è un insiememassimalediverticiCV tale che per ognicoppiadinodiu e v in C, u è raggiungibiledav e v è raggiungibiledau massimale: se siaggiunge un qualsiasivertice a C la proprietà non è piùvera grafodellecomponentifortementeconnessedi G è sempre un DAG!
come sipossonocalcolare le componentifortementeconnessedi un grafodiretto?
Proprietà 1: se siesegue la proceduravisitaDFSricorsiva a partireda un nodou la proceduraterminadopochetuttiinodiraggiungibilidausonostativisitati Idea: eseguireunavisita a partireda un nododiunacomponentepozzo, “eliminare” la componente e ripetere come trovounacomponentepozzo?
Proprietà 2: se C e C’sono due componenti e c’è un arcoda un nodo in C verso uno in C’, allorailpiùgrandevalore post() in C è maggiore del più alto valoredi post() diC’ dim: se la DFS visita prima C’diC: banale. se visita prima C, allorasifermadopoche ha raggiuntotuttiinodidiC e C’ e terminasu un nododiC. Proprietà 3: ilnodochericevedaunavisita DFS ilvalorepiùgrandedi post() appartiene a unacomponentesorgente ma avevamobisognodiunacomponentepozzo? idea: invertiamogliarchi!
G GR Nota bene: le componentifortementeconnessesono le stesse! (perchè?)
VisitaDFS (grafoG) • calcola GR • esegui DFS(GR) per trovarevalori post(v) • returnCompConnesse(G) Complessitàtemporale: se G è rappresentato con liste di adiacenza Θ(n+m) • CompConnesse (grafoG) • for eachnodovdo impostav come non marcato • Comp • for eachnodov in ordinedecrescentedi post(v) do • if (v è non marcato) then • T alberovuoto • visitaDSFRicorsiva(v,T) • aggiungiT ad Comp • returnComp
G GR
G GR 1 2 4 7 9 12 3 8 10 11 5 6 14 23 13 24 16 21 18 19 15 22 17 20