Salta al contenuto
Note per Studenti Rappresentazione dei grafi

Rappresentazione dei grafi

In questa pagina 5

Sia G=(V,E)G = (V, E) con nn vertici ed mm archi (i vertici si indicano spesso con gli interi 1..n1..n o 0..n−10..n-1). Tutte le rappresentazioni partono da due strutture di base:

  • lista dei vertici LVL_V: ogni nodo contiene le informazioni di un vertice distinto; con vertici interi può essere un array;
  • lista degli archi LEL_E: ogni nodo contiene le informazioni di un arco e=(u,v)e = (u, v), compresi i puntatori a uu e a vv.

Ogni vertice o arco può avere campi aggiuntivi (ID, peso, etichette, parent) richiesti dall'algoritmo.

Liste di adiacenza

Per ogni vertice vv una lista I(v)I(v) di puntatori agli archi di LEL_E incidenti su vv (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, Θ(n+m)\Theta(n + m) (in un grafo non diretto ogni arco compare nelle liste dei suoi due estremi);
  • permette di scorrere i vicini di vv in tempo lineare nel grado di vv.

Matrice di adiacenza

Matrice AA di dimensione n×nn \times n, con righe e colonne in corrispondenza 1-1 con i vertici (che devono essere rappresentati da interi):

A[i1,i2]={puntatore a e=(i1,i2)∈LEse l’arco esistenullaltrimenti.A[i_1, i_2] = \begin{cases} \text{puntatore a } e = (i_1, i_2) \in L_E & \text{se l'arco esiste} \\ \text{null} & \text{altrimenti.} \end{cases}

Dà accesso a un arco in tempo costante, ma occupa Θ(n2)\Theta(n^2), che può essere superlineare nella taglia del grafo: conviene per grafi densi (m=Θ(n2)m = \Theta(n^2)).

Confronto

Operazione / risorsa Solo LEL_E Liste di adiacenza Matrice di adiacenza
spazio Θ(n+m)\Theta(n + m) Θ(n+m)\Theta(n + m) Θ(n2)\Theta(n^2)
incidentEdges(v) Θ(m)\Theta(m) Θ(degree(v))\Theta(\text{degree}(v)) Θ(n)\Theta(n)
opposite(v, e) Θ(1)\Theta(1) Θ(1)\Theta(1) Θ(1)\Theta(1)
areAdjacent(u, v) Θ(m)\Theta(m) Θ(min⁡(degree(u),degree(v)))\Theta(\min(\text{degree}(u), \text{degree}(v))) Θ(1)\Theta(1)
scansione di tutti i vicini di tutti i vertici Θ(nm)\Theta(nm) Θ(n+m)\Theta(n + m) Θ(n2)\Theta(n^2)

Rappresentare gli archi solo con LEL_E 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à Θ(n+m)\Theta(n + m) dipendono da questa scelta (con la matrice sarebbero Θ(n2)\Theta(n^2)).

Esempio

Grafo con vertici 1..51..5 e archi e1=(1,2)e_1 = (1,2), e2=(1,3)e_2 = (1,3), e3=(2,3)e_3 = (2,3), e4=(3,4)e_4 = (3,4) (il vertice 55 è isolato).

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: Θ(n)\Theta(n) con le liste (non serve guardare gli archi); con la matrice occorrerebbe Θ(n2)\Theta(n^2).

Errori comuni

  • Usare la matrice di adiacenza per un grafo sparso: spreca spazio (Θ(n2)\Theta(n^2) contro Θ(n+m)\Theta(n + m)) 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 Θ(n)\Theta(n) invece di Θ(degree(v))\Theta(\text{degree}(v)).

Versione ripasso

Esercizi su questo argomento

Teoria collegata