Grafi - definizioni e proprietà
In questa pagina 5
Un grafo ha un insieme di vertici (o nodi) e una collezione di archi (coppie di vertici). È diretto se ogni arco è una coppia ordinata (), non diretto se la coppia è non ordinata (). è una collezione e non un insieme perché si ammettono archi multipli tra due vertici; un self loop è un arco . Un grafo semplice non ha archi multipli né self loop; un grafo pesato associa pesi a archi e/o vertici.
In questo corso si studiano grafi semplici e non diretti (i grafi diretti sono in Grafi diretti e ordinamento topologicoGrafi diretti (archi orientati, grado entrante e uscente, cammini e cicli diretti), visite su grafi diretti e tipi di archi; DAG; ordinamento topologico con l'algoritmo basato sui gradi entranti e con la DFS (reverse postorder), correttezza e costo Theta(n+m); esempio svolto.Grafi diretti e ordinamento topologico →). Esempi: reti sociali, reti stradali, reti di comunicazione (Internet, P2P), web graph, reti biologiche (interazioni tra proteine), molecole, reti di sensori. Il numero di vertici si indica con e quello degli archi con .
Terminologia
- Un arco è incidente su e , che sono adiacenti; i vicini di sono i vertici con .
- Il grado è il numero di archi incidenti su . Un vertice di grado è isolato.
- Un cammino è una sequenza di vertici con ; la lunghezza è il numero di archi, (nei grafi pesati, la somma dei pesi). Un ciclo è un cammino con ; è semplice se i vertici sono tutti distinti (a parte primo e ultimo).
- Un sottografo ha , e gli archi di incidono solo su . È di copertura (spanning) se .
- è connesso se per ogni coppia esiste un cammino da a ; altrimenti è disconnesso.
- Le componenti connesse sono una partizione di in sottografi () con: ogni connesso; e (partizioni); nessun arco tra e per . Sono i sottografi connessi massimali; la partizione è unica; connesso . Esempio: vertici con archi , , , hanno tre componenti: con 1 arco, con 3 archi, senza archi.
Alberi, foreste, spanning tree
- Un albero radicato è un grafo con un vertice radice , un unico padre per ogni , e radice raggiungibile risalendo da ogni vertice (vedi AlberiAlbero radicato (definizione per padre e ricorsiva), terminologia (antenati, discendenti, nodi interni ed esterni, sottoalbero, albero ordinato), profondità, livello, altezza; altezza = massima profondità delle foglie; algoritmi depth e height con costo; somma dei figli = n-1; esempio di algoritmo Omega(n^2) (heightBad).Alberi →).
- Un albero libero è un grafo connesso e senza cicli semplici. Ogni albero radicato è un albero libero; ogni albero libero diventa radicato scegliendo una radice e orientando i legami padre-figlio di conseguenza.
- Una foresta è un grafo senza cicli: un insieme di alberi liberi disgiunti.
- Uno spanning tree di è un sottografo di copertura connesso e senza cicli (un albero libero); esiste solo se è connesso. Una spanning forest è un sottografo di copertura senza cicli: ha un albero per ogni componente connessa.
Proprietà
Sia non diretto e semplice con vertici e archi.
P1. . Dimostrazione: ogni arco è contato esattamente due volte, una per estremo.
P2. , quindi . Dimostrazione: è semplice, perciò è un sottoinsieme delle coppie non ordinate di vertici distinti.
P3. Se è un albero, . Dimostrazione: si vede come albero radicato; coincide con le relazioni padre-figlio, che sono (ogni vertice non radice ha un solo padre).
P4. Se è connesso, . Dimostrazione: finché esiste un ciclo si elimina un suo arco: resta connesso. Alla fine è connesso e senza cicli, cioè un albero libero con archi.
P5. Se è una foresta, . Dimostrazione: finché non è connesso si aggiunge un arco tra due componenti diverse : non può creare cicli. Alla fine è un albero con archi.
Corollario (spanning forest). Un grafo con componenti connesse di vertici ha spanning forest con archi (ogni componente contribuisce con uno spanning tree di archi, per P3). Esempio d'esame: , ; , ; , : il numero massimo di archi in una spanning forest è , indipendentemente dai valori (le prime due componenti sono grafi completi e , la terza ha archi su vertici e quindi contiene almeno un ciclo). Ogni spanning forest che non si può più estendere ha esattamente archi.
Problemi tipici su grafi
Visita (traversal) e crawling, connettività, componenti connesse, cammini minimi (navigatore), minimum spanning tree (broadcast efficiente), stima di distanza media/massima (social network). 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 →, Cammini minimi e algoritmo di DijkstraGrafi pesati, lunghezza di un cammino e distanza; sottocammini di un cammino minimo; problema SSSP; algoritmo di Dijkstra con cloud e priority queue, rilassamento degli archi, esempio svolto; correttezza (due lemmi) e complessità O(min(n^2, (n+m) log n)) con lista non ordinata o heap; pesi non negativi.Cammini minimi e algoritmo di Dijkstra → e Minimum spanning treeMinimum spanning tree di un grafo pesato connesso; proprietà del taglio (cut property) con dimostrazione; algoritmo di Kruskal con partizioni (union-find) e algoritmo di Prim con coda con priorità; esempio svolto sullo stesso grafo di Dijkstra; complessità O(m log n).Minimum spanning tree →.
Errori comuni
- Applicare a un grafo connesso qualsiasi: è vero solo per gli alberi; per i connessi vale .
- Contare archi nella spanning forest di un grafo non connesso: sono con componenti.
- Dimenticare che un grafo con un vertice isolato è disconnesso (se ).
- Confondere lunghezza del cammino (archi) con numero di vertici ().
Versione ripasso
- : diretto (coppie ordinate) o non diretto; collezione (archi multipli, self loop); semplice = né multipli né self loop; pesato. Si studiano grafi semplici non diretti (, ).
- Termini: incidente, adiacente, vicini, grado; cammino (lunghezza = archi), ciclo, ciclo semplice; sottografo, spanning (); connesso/disconnesso; componenti connesse = sottografi connessi massimali, partizione unica, connesso .
- Albero libero = connesso e senza cicli semplici; foresta = senza cicli; spanning tree esiste solo se connesso; spanning forest = un albero per componente (vedi AlberiAlbero radicato (definizione per padre e ricorsiva), terminologia (antenati, discendenti, nodi interni ed esterni, sottoalbero, albero ordinato), profondità, livello, altezza; altezza = massima profondità delle foglie; algoritmi depth e height con costo; somma dei figli = n-1; esempio di algoritmo Omega(n^2) (heightBad).Alberi →).
- P1 (ogni arco due volte). P2 . P3 albero: (un padre per ogni non radice). P4 connesso: (si tolgono archi dai cicli). P5 foresta: (si aggiungono archi tra componenti).
- Spanning forest con componenti: archi; esempio : .
- Problemi: visita, connettività, componenti, cammini minimi, MST (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 →).
- Esempio di componenti: archi , , , e vertice isolato ⇒ componenti: ( arco), ( archi), ( archi).
- Dimostrazioni: P3: relazioni padre-figlio; P4: si tolgono archi da cicli finché ne esistono ⇒ albero con archi; P5: si aggiungono archi tra componenti diverse ⇒ albero con archi.
- Errori: per ogni connesso; archi per spanning forest di grafo sconnesso; lunghezza del cammino = vertici.