Lezione 14
Transcript
Lezione 14
Ordinamento parziale • Ordinamento parziale di un insieme A: relazione d'ordine parziale sugli elementi di A – possono esistere coppie tra le quali non è definito alcun ordine • Un grafo diretto aciclico (DAG) rappresenta un ordinamento parziale: l'insieme dei vertici è l'insieme A ed esiste un arco (u, v) sse u < v secondo l'ordine parziale • Se esiste un ciclo il grafo non può rappresentare un ordine parziale: perché? Laboratorio Algoritmi 29 maggio 2015 1 Archi transitivi l'introduzione/eliminazione di archi transitivi non modifica l'ordine parziale descritto chiusura transitiva = aggiunta di tutti gli archi transitivi riduzione transitiva = eliminazione di tutti gli archi transitivi Laboratorio Algoritmi 29 maggio 2015 2 esempio orologio slip scarpe pantaloni calzini giacca camicia cintura cravatta Laboratorio Algoritmi 29 maggio 2015 3 Ordinamento Topologico in DAG/1 • Un ordinamento topologico di un DAG è un ordinamento dei suoi vertici che soddisfa la seguente condizione: per ogni arco (u, v) del grafo, u precede v nell’ordinamento – a ciascun vertice u si assegna un intero p(u) in modo tale che, se esiste l'arco (u, v), allora p(u) < p(v) – Per la transitività, se esiste un cammino da u a w, allora p(u) < p(w): ogni nodo è seguito, nell’ordinamento, da tutti i suoi discendenti E' sempre possibile determinare un ordinamento topologico di un DAG Laboratorio Algoritmi 29 maggio 2015 4 Ordinamento Topologico in DAG/2 • L'ordinamento può non essere unico • spesso si usano algoritmi che determinano un ordinamento inverso all'ordinamento topologico – consideriamo anch'essi "topological sorter" • Un vertice pozzo è un vertice che non ha archi uscenti. In un DAG esiste sempre almeno un pozzo: perché? Laboratorio Algoritmi 29 maggio 2015 5 Agoritmo 1 TopologicalSort() { for(i = 1; i <= n; i++) { <trova un vertice pozzo v > num(v) = i; <elimina dal DAG v tutti gli archi incidenti in v > } sfruttiamo la proprietà che un sottografo di un DAG DAG } 'num' fornisce la numerazione cercata (inversa) Complessità? Laboratorio Algoritmi 29 maggio 2015 6 è un Algorimo 2 Topological-Sort(G) 1.chiama DFS(G) per calcolare i tempi di fine visita f[v] per ogni vertice v. 2.appena la visita di un vertice è finita, inseriscilo in testa ad una lista concatenata. 3.return la lista concatenata dei vertici. Laboratorio Algoritmi 29 maggio 2015 8 Ordinamento topologico Tempo di esecuzione - ricerca DFS: O(V+E) - inserimento di ciascuno dei |V| vertici in testa alla lista : O(1) per inserimento Quindi il tempo totale è O(V+E) Laboratorio Algoritmi 29 maggio 2015 10 Esempio 4 3 6 1 7 5 2 Laboratorio Algoritmi 29 maggio 2015 11 Cammini minimi in DAG Rilassando gli archi di un grafo pesato G=(V,E, w) secondo un ordine topologico, si possono calcolare i cammini minimi da una singola sorgente in tempo O(V+E). Se vogliamo calcolare i cammini minimi in un DAG dal vertice sorgente s 1. Si chiama la procedura di ordinamento topologico 2. Considerando i vertici nell'ardine topologico a partire da s (quelli precedenti non sono raggiungibili da s), si rilassano gli archi nella lista di adiacenza considerando s come sorgente (d[s] = 0, p[s] = 0) Laboratorio Algoritmi 29 maggio 2015 12 Cammini minimi in DAG DAG-Shortest-Path(G,w,s) 1 ordina topologicamente i vertici di G 2 Inizializza(G,s) 3 foreach u nell’ordine topologico partendo da s 4 5 do foreach vertice v Adj[u] do Relax(u, v, w(u,v)) Laboratorio Algoritmi 29 maggio 2015 13 Esercizi 1.Modificare la procedura DFS per ottenere anche l'ordinamento topologico 2.Implementare l'algoritmo per i cammini minimi da sorgente singola in un DAG 3.Nel caso volessimo il cammino minimo soltanto tra due vertici, si può rendere più efficiente l'algoritmo? Laboratorio Algoritmi 29 maggio 2015 14