Rappresentazione dei grafi
In questa pagina 5
Sia con vertici ed archi (i vertici si indicano spesso con gli interi o ). Tutte le rappresentazioni partono da due strutture di base:
- lista dei vertici : ogni nodo contiene le informazioni di un vertice distinto; con vertici interi può essere un array;
- lista degli archi : ogni nodo contiene le informazioni di un arco , compresi i puntatori a e a .
Ogni vertice o arco può avere campi aggiuntivi (ID, peso, etichette, parent) richiesti dall'algoritmo.
Liste di adiacenza
Per ogni vertice una lista di puntatori agli archi di incidenti su (in alternativa, ai vicini; al posto delle liste si possono usare mappe). È la rappresentazione più usata, e quella assunta se non detto altrimenti, perché:
- occupa spazio lineare nella taglia del grafo, (in un grafo non diretto ogni arco compare nelle liste dei suoi due estremi);
- permette di scorrere i vicini di in tempo lineare nel grado di .
Matrice di adiacenza
Matrice di dimensione , con righe e colonne in corrispondenza 1-1 con i vertici (che devono essere rappresentati da interi):
Dà accesso a un arco in tempo costante, ma occupa , che può essere superlineare nella taglia del grafo: conviene per grafi densi ().
Confronto
| Operazione / risorsa | Solo | Liste di adiacenza | Matrice di adiacenza |
|---|---|---|---|
| spazio | |||
incidentEdges(v) |
|||
opposite(v, e) |
|||
areAdjacent(u, v) |
|||
| scansione di tutti i vicini di tutti i vertici |
Rappresentare gli archi solo con rende lenti gli algoritmi che esplorano i vicini; per questo le visite (vedi Visite di grafi - BFS e DFSVisite in ampiezza (BFS) e in profondità (DFS) come design pattern; etichette discovery, cross e back edge; BFS tree e distanze; complessità Theta(n+m) con liste di adiacenza; applicazioni (connettività, componenti, spanning tree, cammini minimi non pesati, cicli, vertici a distanza al più d); esempio svolto su un grafo di 7 vertici.Visite di grafi - BFS e DFS →) usano le liste di adiacenza, e le loro complessità dipendono da questa scelta (con la matrice sarebbero ).
Esempio
Grafo con vertici e archi , , , (il vertice è isolato).
- , .
- Liste di adiacenza: , , , , . La somma delle lunghezze è (somma dei gradi, vedi Grafi - definizioni e proprietàGrafo G=(V,E) diretto e non diretto, grafo semplice e pesato; incidenza, adiacenza, grado; cammini, cicli, sottografi, grafi connessi e componenti connesse; alberi liberi, foreste, spanning tree e spanning forest; proprietà con dimostrazioni (somma dei gradi = 2m, m <= n(n-1)/2, alberi m = n-1, connessi m >= n-1, foreste m <= n-1).Grafi - definizioni e proprietà →).
- Matrice di adiacenza (1 = arco presente):
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 0 | 0 |
| 2 | 1 | 0 | 1 | 0 | 0 |
| 3 | 1 | 1 | 0 | 1 | 0 |
| 4 | 0 | 0 | 1 | 0 | 0 |
| 5 | 0 | 0 | 0 | 0 | 0 |
Numero di vertici isolati (richiesto in un esame): si scorrono i vertici e si contano quelli con lista di adiacenza vuota: con le liste (non serve guardare gli archi); con la matrice occorrerebbe .
Errori comuni
- Usare la matrice di adiacenza per un grafo sparso: spreca spazio ( contro ) e rende le visite quadratiche.
- Dimenticare che in un grafo non diretto ogni arco compare due volte nelle liste di adiacenza (e due volte nella matrice, simmetrica).
- Esprimere il costo dello scorrimento dei vicini come invece di .
Versione ripasso
- Strutture di base: lista dei vertici (array se vertici interi), lista degli archi (con puntatori agli estremi); campi extra (ID, peso,
parent). - Liste di adiacenza: per ogni lista degli archi incidenti; spazio ; scorrere i vicini costa ; rappresentazione di default.
- Matrice di adiacenza : = arco o
null; accesso a un arco , spazio ; per grafi densi. - Confronto:
incidentEdges(v): solo , liste, matrice;areAdjacent: , , . - Esempio: archi , vertice isolato: somma delle liste (vedi Grafi - definizioni e proprietàGrafo G=(V,E) diretto e non diretto, grafo semplice e pesato; incidenza, adiacenza, grado; cammini, cicli, sottografi, grafi connessi e componenti connesse; alberi liberi, foreste, spanning tree e spanning forest; proprietà con dimostrazioni (somma dei gradi = 2m, m <= n(n-1)/2, alberi m = n-1, connessi m >= n-1, foreste m <= n-1).Grafi - definizioni e proprietà →). Vertici isolati = liste vuote, .
- Visite solo con liste (vedi Visite di grafi - BFS e DFSVisite in ampiezza (BFS) e in profondità (DFS) come design pattern; etichette discovery, cross e back edge; BFS tree e distanze; complessità Theta(n+m) con liste di adiacenza; applicazioni (connettività, componenti, spanning tree, cammini minimi non pesati, cicli, vertici a distanza al più d); esempio svolto su un grafo di 7 vertici.Visite di grafi - BFS e DFS →).
- Errori: matrice per grafi sparsi; archi contati una volta sola nelle liste; costo dei vicini .