Non orientato
La relazione vale in entrambi i versi: {A, B} = {B, A}.
Algoritmi · Strutture dati
Un grafo descrive chi è collegato a chi. BFS procede per livelli con una coda; DFS segue un cammino fino in fondo con uno stack. Nel laboratorio puoi vedere entrambe le strategie, un arco alla volta.
Un grafo è una coppia G = (V, E): V è l’insieme dei vertici (o nodi), E quello degli archi che collegano coppie di vertici. È una struttura più generale di una lista o di un albero: può contenere cicli, più percorsi fra gli stessi nodi e componenti separate.
La relazione vale in entrambi i versi: {A, B} = {B, A}.
L’arco è una coppia ordinata: A→B non implica B→A.
Ogni arco ha un costo, una distanza o una capacità.
Non esiste un cammino fra ogni coppia di vertici.
Due vertici sono adiacenti se condividono un arco. Il grado conta gli archi incidenti; nei grafi orientati si distinguono grado entrante e uscente.
Un cammino è una sequenza di vertici collegati. Nei grafi non pesati la distanza è il minimo numero di archi di un cammino.
È un cammino che torna al vertice iniziale. Per questo una visita deve ricordare i vertici già scoperti.
Una componente connessa è un insieme massimale di vertici reciprocamente raggiungibili. Da una sola sorgente si visita soltanto la sua componente.
Un albero è un grafo non orientato, connesso e aciclico. Ogni coppia di vertici ha un solo cammino semplice; con n vertici possiede esattamente n − 1 archi.
| Struttura | Memoria | Elencare i vicini di u | Verificare (u, v) | Quando conviene |
|---|---|---|---|---|
| Liste di adiacenza | Θ(|V| + |E|) | Θ(deg(u)) | O(deg(u)) | Grafi sparsi e visite BFS/DFS |
| Matrice di adiacenza | Θ(|V|²) | Θ(|V|) | Θ(1) | Grafi densi o query frequenti sugli archi |
| Lista degli archi | Θ(|E|) | Θ(|E|) | Θ(|E|) | Input, ordinamento o scansione globale degli archi |
A: [B, C]
B: [A, D]
C: [A, D]
D: [B, C]
A B C D
A [ 0 1 1 0 ]
B [ 1 0 0 1 ]
C [ 1 0 0 1 ]
D [ 0 1 1 0 ]
Nel laboratorio i vicini sono sempre esaminati in ordine alfabetico. Senza fissare un ordine, BFS e DFS restano corrette ma possono produrre alberi e sequenze differenti.
| Aspetto | BFS · ampiezza | DFS · profondità |
|---|---|---|
| Frontiera | Coda FIFO | Stack LIFO o ricorsione |
| Strategia | Completa un livello prima del successivo | Segue un ramo e poi fa backtracking |
| Garantisce | Distanze minime in grafi non pesati | Tempi di scoperta/chiusura e struttura annidata |
| Usi tipici | Cammini minimi, livelli, bipartizione | Cicli, ordinamento topologico, componenti |
| Tempo | Θ(|V| + |E|) | Θ(|V| + |E|) |
| Spazio ausiliario | O(|V|) | O(|V|) |
Scegli un algoritmo e una sorgente, poi avanza arco per arco. Puoi fare clic su un nodo per renderlo sorgente, modificare gli archi o provare uno dei casi guidati.
Quando un vertice u esce dalla coda, tutti i vertici a distanza minore sono già usciti e quelli appena scoperti hanno distanza d[u] + 1. La FIFO impedisce a un livello successivo di sorpassare quello corrente: la prima distanza assegnata è minima.
Lo stack contiene sempre un cammino dalla radice al vertice corrente. Un vertice viene chiuso solo dopo aver esaminato tutti i suoi archi uscenti; i tempi di scoperta e fine producono intervalli annidati, utili per classificare la struttura del grafo.
Salva il predecessore quando scopri un vertice, poi ricostruisci il cammino dalla destinazione alla sorgente.
Gradi di separazione, propagazione a turni e test di bipartizione seguono naturalmente i livelli.
Un arco verso un vertice ancora attivo rivela un ciclo orientato; l’ordine inverso di chiusura dà un ordinamento topologico se il grafo è aciclico.
Labirinti, componenti, ponti e punti di articolazione sfruttano la struttura profonda dell’albero DFS.
BFS non risolve il cammino minimo con pesi arbitrari: in quel caso servono, a seconda dei pesi, 0-1 BFS, Dijkstra o Bellman–Ford.
Sul grafo ciclico, parti da A: prevedi ordine, distanze e predecessori BFS prima di avviare la simulazione.
Attiva il grafo disconnesso. Confronta il risultato con e senza “Tutte le componenti”: quanti alberi contiene la foresta?
Trova un grafo per cui BFS e DFS abbiano lo stesso ordine e uno per cui siano molto diverse. Che ruolo ha l’ordine dei vicini?