L’approccio ingenuo sarebbe:

  1. trovare le sorgenti del grafo,
  2. 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