L’approccio ingenuo sarebbe:
- trovare le sorgenti del grafo,
- eseguire una DFS da ognuna, controllare se il nodo in input è raggiungibile
La complessità temporale è , ma c’è di meglio si può usare il grafo trasposto , così che le sorgenti di diventino i pozzi di .
Basterà fare una singola visita in a partire da nel grafo alla ricerca dei pozzi raggiungibili.
Implementazione con le liste di adiacenza
def trova_sorgenti(liste, x):
n = len(liste)
grafo_trasposto = trasponi(liste)
visitati = [False] * n
dfs(x, grafo_trasposto, visitati)
sorgenti = []
for nodo in range(n):
# un nodo è sorgente nel grafo se non ha archi uscenti nel grafo trasposto
if grafo_trasposto[nodo] == [] and visitati[nodo]:
lista.append(nodo)
return sorgenti