DAG
Grafo diretto aciclico (Direct acyclic graph).

Nell’esempio corretto (quello di destra), il nodo 1 è un nodo sorgente, dal momento che non ha archi entranti, mentre il nodo 2 è un pozzo, perché non ha archi uscenti.
Ordinamento topologico
Dato un DAG G, un ordinamento topologico è un ordinamento lineare dei nodi tali che, se allora u viene prima di v nell’ordinamento.

Gli archi sono diretti sempre da sinistra verso destra. NB: questo si può fare solo con un grafo aciclico.
Per arrivare ad un risultato del genere ci sono due modi:
- selezionare il nodo sorgente, inserirlo nell’ordinamento eliminandolo dal grafo, e continuare ricorsivamente. Calcolare il costo è complicato dal momento che cambia dall’implementazione del grafo.
- eseguire una DFS, e poi aggiungere all’ordinamento i nodi in base al valore di
post, in ordine decrescente. Il costo è .
Ordinamento tramite DFS
In pratica non serve utilizzare post. Quando si finisce la visita di un nodo, si può aggiungere direttamente ad una pila.
TopologicalSort(G):
s := new_stack()
for all v ∈ V do
visited[v] := false
for all v ∈ V do
if visited[v] == false then
DFS_TS(G, v)
push(s, v)
return s
DFS_TS(G, v):
visited[v] := true
for all (v, u) ∈ E do
if visited[u] == false then
DFS_TS(G, u)