Introduzione
La visita in ampiezza (Breadth First Search) esplora i nodi del grafo partendo da quelli a distanza 1 dal nodo iniziale x
. Poi visita quelli a distanza 2 e così via.
oss: L’algoritmo visita tutti i vertici a livello
k
prima di passare a quelli a livellok+1
.
Definizione Distanza
Dati due nodi
a
eb
di un grafoG
, definiamo la distanza traa
eb
inG
come il numero minimo di archi da attraversare per raggiungereb
partendo daa
.Se il nodo
b
non è raggiungibile partendo daa
allora la loro distanza è posta a .
Algoritmo
Per effettuare questo tipo di visita manteniamo in una coda i nodi visitati i cui adiacenti non sono stati ancora esaminati.
Ad ogni passo, preleviamo il primo nodo dalla coda, esaminiamo i suoi adiacenti e se scopriamo un nuovo nodo lo visitiamo e lo aggiungiamo alla coda.
Ricerca Nodi Raggiungibili
Applichiamo la BFS per ottenere i nodi raggiungibili a partire da un fissato nodo x
.
Si comincia con una coda contenente il solo nodo di partenza x
, fino a che la coda non risulta vuota, ad ogni passo:
- Un nodo viene estratto dalla coda
- Tutti i suoi adiacenti vengono visitati e messi in coda
def BFS(x, G):
'''
restituisce i nodi raggiungibili da `x` in `G`.
'''
visitati = [0]*len(G)
visitati[x] = 1
coda = [x]
while coda:
u = coda.pop(0)
for y in G[u]:
if visitati[y] == 0:
visitatu [y] = 1
coda.append(y)
return visitati
Problema: coda.pop(0)
può richiedere e visto che il while
verrà eseguito volte (tutti i nodi raggiungibili da x
) in totale il costo computazionale di questa applicazione è .
Soluzione: Questo applicazione pò essere implementa con un costo di , se invece di effettuare pop(0)
utilizziamo delle cancellazioni logiche.
Quindi utilizziamo un puntatore testa
per indicare l’inizio della coda all’interno della lista, ed incrementando il puntatore di 1 possiamo “eliminare” a livello logico il primo elemento della coda, ricreando la funzionalità del pop(0)
ma in costo .
def BFS(x, G):
'''
restituisce i nodi raggiungibili da `x` in `G`.
'''
visitati = [0]*len(G)
visitati[x] = 1
coda = [x]
testa = 0
while len(coda) > testa:
u = coda[i]
i += 1
for y in G[u]:
if visitati[y] == 0:
visitatu [y] = 1
coda.append(y)
return visitati
Output
Ritorna il vettore
visitati
dovevisitati[u] = 1
se e solo seu
è raggiungibile dax
.
Costo Coputazionale