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