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
kprima di passare a quelli a livellok+1.

Definizione Distanza
Dati due nodi
aebdi un grafoG, definiamo la distanza traaebinGcome il numero minimo di archi da attraversare per raggiungerebpartendo daa.Se il nodo
bnon è raggiungibile partendo daaallora 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 visitatiProblema: 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 visitatiOutput
Ritorna il vettore
visitatidovevisitati[u] = 1se e solo seuè raggiungibile dax.
Costo Coputazionale
