Algoritmi sui grafi Ordinamento topologico Cammino minimo dalla









- Slides: 9
Algoritmi sui grafi • Ordinamento topologico • Cammino minimo dalla sorgente
Ordinamento topologico Dato un grafo finito orientato aciclico G = V, A , un ordinamento topologico di G consiste in una permutazione v 1, …, vn di V tale che: (vi, vj) A i j. Esempio: G 1 3 2 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.
Visita in profondità rivista DFS (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;
Tempi e precedenze Teorema. 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.
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)
Camminimi Dato un grafo orientato pesato G = V, A, w (w: A funzione peso), ed un cammino = (v 0, v 1), … , (vk-1, vk) in G (not. v 0 vk), si definisce il peso di come la somma dei pesi degli archi: 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: Nolta: w*( ) = 0 ( è il cammino vuoto), dunque (v, v) = 0 per ogni v.
Algoritmo di Dijkstra E’ una tecnica greedy basata sulla definizione di un confine superiore d[v] a (s, v) per ogni v, che viene progressivamente migliorato. coda con estrazione del minimo Dijkstra(Graph G = (V, A), Vertex s) foreach v V do d[v] : = ; d[s] : = 0; q : = Empty. Priority. Queue (); // la priorita’ di ogni v in q e’ d[v] foreach v V do Enqueue(v, q); while not Is. Empty. Queue(q) do u : = Dequeue. Min(q); foreach v Adj[u] do if d[v] > d[u] + w(u, v) then d[v] : = d[u] + w(u, v); rilassamento Redefine. Prior(v, d[v], q); return d; assegna priorità d[v] al vertce v in q
Osservazioni Nell’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.
Fine









