• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida Algoritmo BFS per grafi

sant0

Utente Esperto
Autore del topic
1 Settembre 2014
1.345
124
Miglior risposta
0
Il breadth-first search (o ricerca in ampiezza) è un algoritmo utilizzato nella teoria dei grafi, il quale permette di partire da un nodo X ed espandere la ricerca come un raggio. L'implementazione di codesto algoritmo è simile alla ricerca in profondità (o DFS) ma al contrario, viene utilizzata come struttura dati ausiliaria una coda e non una pila.

Non sono qui a spiegare cos'è un grafo o una coda, ma bensì solo l'algoritmo. Magari più avanti posterò una guida su cosa sono.

Implementazione
Partendo da una lista di adiacenza l'algoritmo spingerà in coda tutti i nodi correlati finché essa non resterà vuota e tutti i nodi saranno stati esaminati. È giusto sottolineare che, nodi non correlati, non saranno mai esaminati. Nel secondo grafo dell'immagine qui sotto, i nodi 4 e 5, non saranno mai esaminati.
310px-Connexe_et_pas_connexe.svg.png

Per vedere se un nodo è stato visitato o meno si possono usare due strade diverse:
  • array di valori booleani (true se è stato visitato in precedenza; false se ancora no);
  • array di valori interi con tre stati: BIANCO => non visitato; GRIGIO => in visita; NERO => già visitato).
Personalmente preferisco utilizzar il primo, dato che un array di valori bool occupano meno spazio, ma nell'implementazione utilizzeremo la versione con i tre stati. Di seguito una gif dell'algoritmo in un grafo orientato:
giphy.gif

La complessità di suddetto algoritmo è O(|V|+|E|) ove V è il numero dei vertici e E il numero degli archi.

Pseudo codice
l'algoritmo utilizza anche la distanza come informazione degli archi
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Codifica
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Un esempio di caricamento della lista potrebbe essere:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Un esempio di esecuzione del programma potrebbe essere questa:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
L'esempio che abbiano eseguito è quello della gif postata sopra.

La compilazione del programma deve avvenire con il flag -std=c++11.
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Se vi si vuole usare una versione precedente, bisogna modificare:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
in:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

La guida è finita, spero di esservi stato d'aiuto :emoji_nerd:
 
Ultima modifica:
Ottima guida, ho studiato tutto ciò all'esame di Programmazione 2, e devo dire che hai seguito l'argomento come si deve con tanto di codifica in C++.
A questo punto aspetto il DFS!
 
  • Like
Reactions: sant0