verificare se un grafo diretto ha un pozzo universale

In questo caso, è più comodo utilizzare la rappresentazione tramite matrice - essa ci permette infatti di risolvere il problema in .

Osserviamo un esempio di un pozzo universale in questa rappresentazione:

C’è un semplice test che ci permette di eliminare uno dei due nodi rappresentati da ogni posizione della matrice:

  • se , sicuramente so che (la riga, ovvero il nodo da cui l’arco parte) non è un pozzo infatti, c’è un arco che parte da esso
  • se , so che non è pozzo universale non c’è un arco entrante in (ma potremmo trovarci nella situazione dell’esempio, quindi non escludiamo )

Quindi, una soluzione sarebbe:

def pozzo(M):
n = len(M)
L = [x for x in range(n)]; # creo una lista con tutti i nodi
 
# prendo due nodi per controllare
while len(L)>1:
	a = L.pop() # uso pop perché è O(1)
	b = L.pop()
	if M[a][b]: # se è 1
		L.append(b) # a non è pozzo, quindi teniamo b
	else:
		L.append(a) # b non è pozzo universale, quindi teniamo a
 
L.pop()
for j in range(n): # controllo la riga 
	if M[x][j]: 
		return False # se non sono tutti zeri, non è pozzo univ.
 
for i in range(n):
	if i != x and M[i][x] == 0:
		return False # se ci sono zeri oltre a quello in (x,x), ""
 
return True