Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

9
Algoritmi sui grafi • Ordinamento topologico • Cammino minimo dalla sorgente

Transcript of Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Page 1: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Algoritmi sui grafi

• Ordinamento topologico

• Cammino minimo dalla sorgente

Page 2: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Ordinamento topologicoDato un grafo finito orientato aciclico G = V, A, un ordinamento topologico di G consiste in una permutazione v1,…,vn di V tale che:

(vi, vj) A i j.

Esempio:

1 2

3 4

1, 3, 2, 4 è un ordinamento

topologico di G;

1, 2, 4, 3 non lo è perché (3,2) A

mentre 3 segue 2 in questa

permutazione.

G

Page 3: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Visita in profondità rivistaDFS (G = V,A)

foreach v V // inizializza i colori

Color[v] := White; Time[v] := indef;

time := 0; // variabile globale

foreach u V // itera la visita in prof.

if Color[u] = White then DFS-Visit(u)

DFS-Visit (u)

Color[u] := Gray; time := time + 1;

foreach v Adj[u]

if Color[v] = White then DFS-Visit(v);

Color[u] := Black;

Time[u] := time; time := time + 1;

Page 4: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Tempi e precedenzeTeorema. Sia G = V, A un grafo orientato aciclico.

Se (u,v) A, con u v, allora dopo DFS(G) Time[u] > Time[v].

Dim. P.a. sia (u,v) A tale che Time[u] < Time[v].

Allora al tempo t = Time[u] si ha

Color[u] = Black, Color[v] = White Color[v] = Gray.

• Color[v] = White è impossibile perché, se (u,v) A allora la visita di u non è completa (e quindi u non avrebbe potuto diventare nero al tempo t);

• Color[v] = Gray: allora esiste t< t tale che si abbia:

al tempo t Color[u] = White Color[v] = Gray,

al tempo t + 1 Color[u] = Color[v] = Gray.

Quindi esiste in G un cammino da v ad u (per la struttura della frontiera in DFS-Visit); ma allora (u,v) A implica che G sia ciclico.

Page 5: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Topological Sorting (TS)TS (Graph G = (V,A))

foreach v V // inizializza i colori

Color[v] := White;

l := NIL; // lista di vertici (globale)

foreach u V // itera la visita in prof.

if Color[u] = White then DFS-Visit-List(u)

return l;

DFS-Visit-List (Vertex u)

Color[u] := Gray;

foreach v Adj[u]

if Color[v] = White then DFS-Visit(v);

Color[u] := Black;

l := Cons(u,l); // se u precede v in l allora

// Time[u] > Time[v] in DFS(G)

Page 6: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Cammini minimiDato un grafo orientato pesato G = V, A, w (w:A funzione peso), ed un cammino = (v0, v1), … , (vk-1, vk) in G (not. v0 vk), si definisce il peso di come la somma dei pesi degli archi:

),()(*1 1 vvww i

k

i i

Problema del cammino minimo da sorgente singola.

Dato G orientato e pesato ed un vertice s, per ogni vertice v determinare un cammino tale che s v e w*() = (s,v), dove:

altrimenti

esiste se }|)(*min{),(

vuwvu

Nolta: w*() = 0 ( è il cammino vuoto), dunque (v,v) = 0 per ogni v.

Page 7: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Algoritmo di DijkstraE’ una tecnica greedy basata sulla definizione di un confine superiore d[v] a (s,v) per ogni v, che viene progressivamente migliorato.

Dijkstra(Graph G = (V,A), Vertex s)

foreach v V do d[v] := ;

d[s] := 0; q := EmptyPriorityQueue ();

// la priorita’ di ogni v in q e’ d[v]

foreach v V do Enqueue(v,q);

while not IsEmptyQueue(q) do

u := DequeueMin(q);

foreach v Adj[u] do

if d[v] > d[u] + w(u,v) then

d[v] := d[u] + w(u,v);

RedefinePrior(v,d[v],q);

return d;

rilassamento

coda con estrazione del minimo

assegna priorità d[v] al vertce v in q

Page 8: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

OsservazioniNell’algoritmo di Dijkstra:

• si presuppone che il grafo abbia pesi non negativi oppure che sia aciclico;

• si mantiene una partizione tra vertici visitati e non (v è stato visitato se

e solo se d[v] );

• la priorità di un vertice v in q è d[v] ;

• l’invariante del ciclo principale è:

se v è stato visitato, allora d[v] = (s,v)

dove (s,v) è il valore di (s,v) nel sottografo formato dai vertici visitati e

dagli archi i cui estremi siano stati visitati.

Page 9: Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla sorgente.

Fine