Dipartimento di Elettronica, Informazione e Bioingegneria API 2012/3 Alberi ricoprenti e cammini nei grafi @ G. Gini 2013 Relazioni fra alberi e grafi Un grafo non orientato è un albero libero se è connesso e per ogni coppia di nodi esiste una e una sola catena semplice (senza circuiti) Un albero di copertura (spanning tree) T di un grafo connesso G = (V, E) è un albero libero T(V, E’) composto da tutti i nodi V e da un sottoinsieme degli archi E’⊆E tale per cui tutte le coppie di nodi del grafo siano connesse da una sola catena nell’albero G. Gini 2013/4 G. Gini 2013/4 Memoria per grafo Memoria per liste di adiacenza –il numero totale di elementi nelle liste è |E| = m –il numero di elementi nell'array è |V| = n –la complessità spaziale è Θ(|V| + |E|) = Θ(n+m) Memoria per matrice di adiacenza –la dimensione della matrice è |V|2, quindi la sua complessità è Θ(|V|2) Scelte: Le liste di adiacenza sono migliori quando il grafo è sparso Se il grafo è completo (o quasi), tanto vale usare una matrice di adiacenza –un grafo orientato è completo se, per ogni coppia di nodi u e v, sia l'arco (u, v) che l'arco (v, u) sono in E Si ricordi che |E| ≤ |V|2, cioè |E| = O(|V|2) G. Gini 2013/4 Complessità temporali • VISITA DI GRAFO • 2 metodi: visita in ampiezza (BFS) e in profondità (DFS) • La complessità di BFS è O(|V| + |E|) ogni nodo è messo in coda al massimo una volta, il ciclo è ripetuto al massimo E volte • la complessità di DFS è Θ(|V| + |E|) . Colorare i nodi inizialmente è Θ(|V|), ogni arco è visitato esattamente una volta Θ(|E|) G. Gini 2013/4 Usi della visita depth first La visita dfs ha complessità temporale Θ(n+m) Usata per risolvere con la stessa complessità 3 altri problemi: 1. Componenti connesse del grafo 2. Albero di copertura 3. Ordinamento topologico G. Gini 2013/4 Dfs pseudocodice dfs (GRAPH G, NODE u, boolean [ ] visitato) visitato [u] <-true esamina u in caso previsita foreach v ∈ G. adj(u) do esamina arco (u,v) if not visitato [v] then visitato [v] <-true dfs (G, v, visitato) esamina u in caso postvisita G. Gini 2013/4 1- Grafi connessi • Un grafo non orientato G G è connesso ⇔ esiste un cammino da ogni vertice ad ogni altro vertice Un grafo G′ = (V′, E′) è una componente connessa di G ⇔ è un sottografo di G connesso e massimale G′ è un sottografo di G (G′ ⊆ G) se e solo se V′ ⊆ V e E′ ⊆ E G′ è massimale ⇔ non esiste un A1 sottografo G′′ di G che sia connesso e “più grande” di G′, ovvero tale per cui G′ ⊆ G′′ ⊆ G 2 3 4 5 6 © Alberto Montresor G. Gini 2013/4 Componenti connesse • Problema 1 1. Verificare se un grafo non orientato è connesso • Soluzione è BANALE Un grafo è connesso se, al termine della visita DFS, tutti i nodi sono stati marcati Altrimenti, una singola passata non è sufficiente e la visita deve ripartire da un nodo non marcato, scoprendo una nuova porzione del grafo © Alberto Montresor G. Gini 2013/4 Componenti connesse 1 3 1 1 2 2 5 6 2 3 1 10 2 4 1 7 9 2 8 © Alberto Montresor 2 G. Gini 2013/4 3 11 IDENTIFICARE componenti connesse Problema 2 Identificare le componenti connesse di cui è composto un grafo • Struttura dati Vettore id - identificatori delle componenti connesse • Counter - numero di componenti connesse trovate finora • © Alberto Montresor id[u] è l’identificatore della componente connessa a cui appartiene u Ogni volta che viene trovato un nuovo nodo id[u] =0 si incrementa di 1 counter e lo si assegna a tutti i nodi scoperti finora In input una permutazione dei nodi di G da cui far partire la visita G. Gini 2013/4 Componenti connesse ComponentiConnesse (G, ordine) foreach vertex u in G id[u] = 0 conta = 0 for i =1 to n do if id [ordine [i] ] = 0 then conta = conta+1 ccdfs (G, conta, ordine [i] , id) Return id ccdfs (G, conta, node, id) id[u] = conta foreach v in G.adj(u) do if id[v] = 0 then Ccdfs (G, conta, v, id) © Alberto Montresor G. Gini 2013/4 2 - Alberi di copertura • La visita DFS genera l’albero T dei cammini • Tutte le volte che viene incontrato un arco che connette un nodo marcato ad uno non marcato, esso viene inserito in T Gli archi non in T possono essere divisi in tre categorie durante la visita: se l’arco è esaminato passando da un nodo di T ad un suo antenato in T, è detto arco all’indietro (ad esempio (3-1) se l’arco è esaminato passando da un nodo di T ad un suo discendente (che non sia figlio) in T è detto arco in avanti (ad esempio (1-3) altrimenti, è detto arco di attraversamento (ad esempio (4-2) e (4-3) 1 2 3 4 1 © Alberto Montresor G. Gini 2013/4 2 4 3 Ordine di visita: 1 (1-2) 2 (2-3) 3 (3-1)(1-3)(1-4) 4 (4-2)(4-3) Schema di soluzione • Orologio time inizializzato a 0 ed incrementato ad inizio e fine di dfs • Due vettori: discovery time (dt) e finish time (ft) Inizializzati a zero (visita non iniziata), incrementati con il valore dell’orologio per stabilire il tipo di arco Confrontando i valori dt[u], dt[v], ft[v] si stabilisce il tipo di arco u-v • Se dt[v]=0 la visita di v non è iniziata quindi (u-v) è in T, altrimenti non è in T. • Se dt[u] > dt[v] e ft[v] ≠0 la visita di v è iniziata dopo quella di v e quindi u-v è indietro; • Se dt[u] < dt[v] e ft[v] ≠0 la visita di v è iniziata e finita dopo u, quindi u-v è in avanti; • altrimenti è di attraversamento G. Gini 2013/4 Schema DFS T albero in costruzione Parti da u; per tutti i nodi adiacenti se non ancora visitati visitali ricorsivamente G. Gini 2013/4 Esempio [1, ] F B C I A M D E H G © Alberto Montresor G. Gini 2013/4 L Esempio [1, ] F [2, ] B C I A M D E H G © Alberto Montresor G. Gini 2013/4 L Esempio [1, ] F [2, ] [3, ] B C I A M D E H G © Alberto Montresor G. Gini 2013/4 L Esempio [1, ] F [2, ] B [3, ] C I A M [4, ] D E H G © Alberto Montresor G. Gini 2013/4 L Esempio [1, ] F [2, ] B [3, ] C I A M [5, ] [4, ] D E H G © Alberto Montresor G. Gini 2013/4 L Esempio [1, ] F [2, ] B [3, ] C I [6, ] A M [5, ] [4, ] D E H G © Alberto Montresor G. Gini 2013/4 L Esempio [1, ] F [2, ] B [3, ] C I [6, 7] A M [5, ] [4, ] D E H G © Alberto Montresor G. Gini 2013/4 L Esempio [1, ] F [2, ] B [3, ] C I [6, 7] A M [5, ] [4, ] D E H G © Alberto Montresor [8, ] G. Gini 2013/4 L Esempio [1, ] F [2, ] B [3, ] C I [6, 7] A M [5, ] [4, ] D E H [9, ] G © Alberto Montresor [8, ] G. Gini 2013/4 L Esempio [1, ] F [2, ] B [3, ] C I [6, 7] A [10, ] M [5, ] [4, ] D E H [9, ] G © Alberto Montresor [8, ] G. Gini 2013/4 L Esempio [2, 17] [1, 18] F B [3, 16] C I [6, 7] A [10, 11] M [5,14 ] [4,15] D E H [9, 12] G © Alberto Montresor [8, 13] G. Gini 2013/4 L Esempio [2, 17] [1, 18] F B [3, 16] C I [6, 7] A [10, 11] [19, ] M [5,14 ] [4,15] D E H [9, 12] G © Alberto Montresor [8, 13] G. Gini 2013/4 L Esempio [2, 17] [1, 18] F B [3, 16] C I [6, 7] A [10, 11] [19, ] M [5,14 ] [4,15] D [20, ] E H [9, 12] G © Alberto Montresor [8, 13] G. Gini 2013/4 L Esempio [2, 17] [1, 18] F B [3, 16] C I [6, 7] A [10, 11] [19, 22] M [5,14 ] [4,15] D [20, 21] E H [9, 12] G © Alberto Montresor [8, 13] G. Gini 2013/4 L 3 - Ordinamento topologico • Dato un DAG G (direct acyclic graph), un ordinamento topologico (o linearizzazione) su G è un ordinamento lineare dei suoi vertici tale che: se G contiene l’arco (u,v), allora u compare prima di v nell’ordinamento Per transitività, se v è raggiungibile da u, allora u compare prima di v nell'ordinamento 2 1 3 1 3 5 2 4 2 3 4 5 4 5 1 G. Gini 2013/4 Note • Tutti i grafi hanno un ordinamento topologico? NO, solo i grafi aciclici possono essere linearizzati • Dato un grafo, possono esserci più ordinamenti topologici • Applicazioni dell’ordinameno toologico: Pianificazione Make (programma di utiltà per la compilazione) G. Gini 2013/4 Ordinamento topologico • i nodi sono disposti in modo tale che ogni nodo viene prima di tutti i nodi collegati ai suoi archi uscenti. • L'ordinamento topologico è un ordinamento parziale. • usato per definire relazioni di precedenza nel caso peggiore si possono avere ordinamenti topologici diversi che corrispondono a tutte le possibili permutazioni dei nodi. È possibile ordinare topologicamente un grafo se e solo se non ha circuiti G. Gini 2013/4 Esempio Grafo ordinamenti G. Gini 2013/4 Algoritmo per ordinamento Soluzioni ✦Diretta ✦ Trovare ogni vertice che non ha alcun arco incidente in ingresso Stampare questo vertice e rimuoverlo, insieme ai suoi archi Ripetere la procedura finché tutti i vertici risultano rimossi Basata su DFS ✦ G. Gini 2013/4 Soluzione diretta 2 1 3 2 4 3 5 5 Output: - Output: 1 2 4 4 5 Output: 1 3 2 4 Output: 1 3 5 4 Output: 1 3 5 2 G. Gini 2013/4 Output: 1 3 5 2 4 Ordinamento usando DFS •Idea per l'algoritmo: uso del colore per visitato –visitiamo il DAG con un algoritmo DFS –quando coloriamo un nodo u di G di nero (cioè ogni volta che finiamo di visitare un nodo di G), inseriamo u in testa alla lista –dopo che abbiamo visitato tutti i nodi di G, la lista che abbiamo costruito è un ordinamento topologico di G G. Gini 2013/4 Ordinamento topologico Il tempo di esecuzione di TOPOLOGICALSORT è lo stesso di DFS, cioè Θ(|V| + |E|) G. Gini 2013/4 Problemi di ottimizzazione su grafo • Si richiede di minimizzare o massimizzare un costo • Albero di copertura di peso minimo (MST minimum spanning tree) determinare come interconnettere diversi elementi fra loro minimizzando certi vincoli sulle connessioni • Esempio: progettazione dei circuiti elettronici - si vuole minimizzare la quantità di filo elettrico per collegare fra loro i diversi componenti G. Gini 2013/4 Definizione del problema • Input: G=(V,E) un grafo non orientato e connesso w: V×V → R una funzione di peso (costo di connessione) • se [u,v] ∈ E, allora • se [u,v] ∉ E, allora w(u,v) è il peso dell'arco [u,v] w(u,v) = ∞ Poiché G non è orientato, w(u,v) = w(v,u) G. Gini 2013/4 Definizione albero di copertura Dato un grafo G=(V,E) non orientato e connesso, un albero di copertura di G è un sottografo T=(V, ET) tale che • T è un albero • ET ⊆ E • T contiene tutti i vertici di G 8 b c 4 2 a 11 7 i 8 7 h 6 d 1 G. Gini 2013/4 14 4 g f 2 9 10 e MST • albero di copertura minimo (minimum spanning tree MST L'albero di copertura il cui peso totale sia minimo • Nota: L’albero di copertura di peso minimo non è unico 8 7 b c 4 d i 7 4 g 1 f 10 i h G. Gini 2013/4 6 9 14 4 g 1 2 d 2 a 11 7 8 7 c 4 e 14 6 8 h b 9 2 11 a 8 f 2 10 e Algoritmo generico • Possiamo creare un ordinamento e da qui una scelta di tipo “greedy” Due “istanze” di questo algoritmo: Kruskal e Prim L'idea: accrescere un sottoinsieme A di archi in modo tale che A sia un sottoinsieme di qualche albero di connessione minimo Un arco [u,v] è detto sicuro per A se A ∪ {[u,v]} è ancora un sottoinsieme di qualche albero di connessione minimo. G. Gini 2013/4 Algoritmo generico SET minSpanTree(GRAPH G, int []w) Set A <- Ø while A non forma albero di copertura do Trova arco sicuro (u, v) A <- A U {(u, v)} return A G. Gini 2013/4 Esempio mst G. Gini 2013/4 Definizioni Un taglio (S,V-S) di un grafo non orientato G=(V,E) è una partizione di V in due sottoinsiemi disgiunti Un arco [u,v] attraversa il taglio se u ∈S e v ∈V-S Un taglio rispetta un insieme di archi A se nessun arco di A attraversa il taglio Un arco che attraversa un taglio è leggero nel taglio se il suo peso è il minimo fra i pesi degli archi che attraversano il taglio G. Gini 2013/4 Esempio 8 7 b c d 9 2 4 11 a Arco leggero che attraversa il taglio i 7 6 14 4 8 h g 1 f 2 10 e V Taglio V-S Insieme A: archi in grigio Il taglio rispetta A © Alberto Montresor G. Gini 2013/4 Arco leggero e sicuro • Teorema: Sia G=(V,E) un grafo non orientato e connesso Sia w una funzione peso a valori reali definita su E Sia A ⊆ E contenuto in un qualche albero di copertura minimo per G Sia (S,V-S) un taglio che rispetta A Sia [u,v] un arco leggero che attraversa il taglio. • Allora l’arco [u,v] è sicuro per A © Alberto Montresor G. Gini 2013/4 arco non sicuro - il taglio non rispetta A 8 4 b 2 a 11 7 8 8 4 b 2 a 11 7 8 h i 1 7 c 6 g d f 6 9 e 14 4 g 1 d f 2 10 8 4 b a 11 7 8 h 2 i 1 Arco non sicuro © Alberto Montresor c 10 Arco sicuro e 14 4 2 9 h i 7 G. Gini 2013/4 7 c 6 g d 14 4 2 9 f 10 e arco non sicuro - non leggero 8 7 b 4 2 a 11 7 i 8 8 b 4 2 a 11 7 i 8 7 c h 6 g 1 6 h f 10 Arco sicuro e 8 10 2 2 a 11 7 i h 6 d Arco non sicuro f 2 9 14 4 g 1 G. Gini 2013/4 7 c 4 8 © Alberto Montresor e 2 b f 9 14 g 9 14 d 4 1 d 4 c 10 e mst-greedy generico G. Gini 2013/4 • 2 algoritmi principali G. Gini 2013/4 Algoritmo di Kruskal • Idea Ingrandire sottoinsiemi disgiunti di un albero di copertura minimo connettendoli fra di loro fino ad avere l’albero complessivo Si individua un arco sicuro scegliendo un arco [u,v] di peso minimo tra tutti gli archi che connettono due distinti alberi (componenti connesse) della foresta © Alberto Montresor L’algoritmo è greedy perché ad ogni passo si aggiunge un arco con il peso minore G. Gini 2013/4 Algoritmo di Kruskal G. Gini 2013/4 G. Gini 2013/4 G. Gini 2013/4 G. Gini 2013/4 Pseudocodice Kruskal • • • Crea una foresta dove ogni vertice è un albero Crea l’insieme S degli archi while S non è vuoto e F non coperto Rimuovi da S l’arco di peso minimo Se questo arco congiunge due alberi diversi aggiungilo alla foresta ed unisci due alberi • Nota: se i vertici appartenessero allo stesso albero collegheremmo due vertici di un albero ottenendo un ciclo Altrimenti eliminalo KRUSKAL(G) 1 A=∅ 2 foreach v ∈ G.V //crea gli alberi per ogni vertice 3 MAKE-SET(v) 4 foreach (u, v) ordinato per peso crescente: //ordina archi 5 if FIND-SET(u) ≠ FIND-SET(v): // vertici dell’arco sono in diversi alberi? 6 A = A ∪ {(u, v)} // allora aggiungilo 7 UNION(u, v) //fondi in unico insieme 8 return A G. Gini 2013/4 Analisi • tempi L’inizializzazione richiede O(n) - n numero nodi L'ordinamento richiede O(m lgn) – m numero archi Vengono eseguite O(m) operazioni sulla foresta di insiemi disgiunti • Totale: O(n+m lgn + m) = O(m lgn) O(|E|*lg|V|) G. Gini 2013/4 Algoritmo di Prim • L’algoritmo di Prim procede mantenendo in A un singolo albero L’albero parte da un vertice arbitrario r (la radice) e cresce fino a quando non ricopre tutti i vertici Ad ogni passo viene aggiunto un arco leggero che collega un vertice in VA con un vertice in V-VA, dove VA è l'insieme di nodi raggiunti da archi in A • è indispensabile utilizzare una struttura dati che contenga ad ogni passo tutti gli archi candidati all’inserimento in T, ossia gli archi che connettono un nodo in T con uno non in T Coda con priorità (peso) G. Gini 2013/4 Algoritmo di Prim Grafo G(N, E1) -> grafo Albero T(N, E2) -> MST NB: E2 ⊆ E1 Albero Prim(Grafo) { considera T formato da un nodo e nessun arco; while(esistono nodi in T adiacenti a un nodo non in T) { seleziona l’arco di peso minimo che collega un nodo in T con un nodo non in T; aggiungi a T sia l’arco selezionato che il nuovo nodo; } return T; } G. Gini 2013/4 Algoritmo di Prim: Esempio 4 b 8 c 4 2 a 11 7 i 8 h 8 6 d 4 1 f e b 7 c 8 2 h 8 © Alberto Montresor i 6 7 d a 11 7 i 8 2 f 4 h 8 e 10 7 G. Gini 2013/4 c i h 6 1 7 d f 6 2 9 e 14 4 g e 10 f 8 a 11 7 9 14 4 2 2 7 d 1 4 8 6 7 g b 9 14 4 g 1 2 10 2 a 11 7 4 2 8 4 b 9 14 g 8 c 8 7 10 Algoritmo di Prim: Esempio 8 7 b c 4 2 a 11 7 i 8 h 7 d 6 7 7 d i © Alberto Montresor 6 g 1 f 7 c 6 e 10 f 2 2 a 11 7 i h 1 G. Gini 2013/4 10 7 c 4 8 10 e 2 b 9 9 14 g 1 7 d 4 8 14 4 i h 1 10 h 1 8 10 2 a 11 7 8 10 8 6 2 a 11 7 2 c 4 4 e 14 f 8 b b 9 4 g 2 1 7 6 g6 d 14 4 f 2 9 10 e 9 Algoritmo di Prim: Esempio 8 7 b c 4 2 a 11 7 i 8 6 h d f 10 2 i © Alberto Montresor e 14 4 g 1 9 G. Gini 2013/4 a b c f g h d e Algoritmo di Prim: Analisi • • L’efficienza dell’algoritmo di Prim dipende dalla coda Q Se Q viene realizzata tramite uno heap binario: Inizializzazione: O(n log n) Il ciclo principale viene eseguito n volte ed ogni operazione extractMin() è O(log n) Il ciclo interno viene eseguito O(m) volte L'operazione decreaseKey() sullo heap che costa O(log n) • Tempo totale: O(n+n log n + m log n)=O(m log n) asintoticamente uguale a quello di Kruskal © Alberto Montresor G. Gini 2013/4 • esercizi G. Gini 2013/4 Esercizio 1 • • • • • • Dato il seguente grafo orientato aciclico, dire quali delle seguenti sequenze di nodi ne costituiscono un ordinamento topologico e quali no, motivando la risposta per i casi negativi. ACEBDGFIKHJ ADECBFHKGIJ ABCEDFHJGIK ABCDFEGHKJI ACBEDGIFJHK B A F D C J H K G E G. Gini 2013/4 I Soluzione 1 • • • • • ACEBDGFIKHJ ADECBFHKGIJ ABCEDFHJGIK ABCDFEGHKJI ACBEDGIFJHK NO: K precede H NO: D precede B, E precede C SI NO: K precede I, NO: J precede H B A F D C J H K G E G. Gini 2013/4 I Esercizio 2 • • • • • • Sia dato un gruppo G = {S1, S2, … Sn} di società per azioni. Ogni società può possedere una quota (espressa in %) di altre società. Non sono però ammesse circolarità: la società X non può possedere quote di Y se Y possiede quote di Z e Z di X. Una società X controlla la società Y se: a) X possiede più del 50% delle quote di Y; oppure se b) La somma delle quote di possesso di Y delle società controllate da X –ivi inclusa X stessa- supera il 50%. Ad esempio, se X possiede il 60% di Y, il 30% di Z, e Y possiede il 21% di Z, X controlla sia Y che Z. Senza entrare in tutti i dettagli implementativi, si progetti una struttura dati per rappresentare le relazioni di possesso e di controllo tra le società e si descriva un algoritmo che, dato un insieme di società e le quote di possesso tra esse determini, per una generica coppia X, Y se X controlla Y. Si valuti l’ordine di grandezza della complessità temporale di tale algoritmo. G. Gini 2013/4 Soluzione 2 (traccia) • • • • • La relazione di possesso tra società di G è naturalmente rappresentata da un grafo: un arco orientato va da X a Y se X possiede una quota di Y; l’arco è etichettato dall’ammontare della % di possesso. Un modo banale per determinare l’insieme delle società controllate da una generica società X è il seguente: L’insieme C delle controllate di X è inizializzato con le società di cui X possiede più del 50%, compresa X stessa. Per ogni società S in G – C si calcoli la somma delle % di possesso di S tra tutte le società in C. Se questa somma supera il 50% si inserisca S in C. Si ripeta il passo precedente fino a che l’insieme C non muta più. L’esecuzione del ciclo di cui sopra richiede un tempo Θ(n2). Il ciclo va ripetuto al più n volte (una società viene inserita in C ad ogni ripetizione. Di conseguenza la complessità totale nel caso pessimo è Θ(n3). G. Gini 2013/4 Esercizio 3 G. Gini 2013/4 Soluzione 3 G. Gini 2013/4 Esercizio 4 G. Gini 2013/4 Soluzione 4 G. Gini 2013/4 Esercizio 5 • • • È dato un insieme di n giocatori di un certo sport (e.g., calcio). Fra alcuni di essi esiste una relazione di “rivalità personale”, rappresentata con un insieme di r coppie di giocatori che sono rivali. (Si noti che tale rivalità è una relazione simmetrica, nel senso che se il giocatore Tizio è rivale del giocatore Caio allora senz’altro anche Caio è rivale di Tizio) Si può facilmente rappresentare la relazione di rivalità mediante un grafo, in cui l’insieme V dei vertici corrisponde a quello dei giocatori. 1. Indicare le caratteristiche di questo grafo (è orientato? è necessariamente ciclico o privo di cicli? è necessariamente connesso o non connesso?). • Soluzione quesito 1 • Il grafo è non orientato, può essere connesso o no, può essere ciclico o no G. Gini 2013/4 Esercizio 5 cont. • • Si vogliono formare due squadre utilizzando tutti gli n giocatori in modo tale che tra qualsiasi coppia di giocatori della stessa squadra non esista rivalità; nel formare le squadre si è disposti a rinunciare a ottenere due squadre che abbiano lo stesso numero di giocatori. 2 . Tratteggiare un algoritmo, di complessità Θ(n+r), che permetta di stabilire se è possibile dividere i giocatori in due squadre nel modo indicato e, nel caso in cui ciò sia possibile, produca l’elenco dei giocatori di ognuna delle due squadre. Si argomenti, informalmente ma in modo chiaro e sintetico, che l’algoritmo proposto è corretto. • Soluzione quesito 2 • L’algoritmo è una variazione di una visita breadth-first del grafo che tenta di etichettare i nodi del grafo con i “colori” delle due squadre in modo alternato G. Gini 2013/4 Esercizio 5 cont. • 3. Indicare in quali casi è possibile formare le squadre nel modo indicato e in quali casi non lo è, preferibilmente definendo una semplice proprietà dei cammini, presenti nel grafo corrispondente alla relazione di “rivalità personale”, che costituisca una condizione necessaria e sufficiente per poter formare le due squadre. Soluzione quesito 3 • Non devono esistere cicli di lunghezza dispari G. Gini 2013/4 Esercizio 6 G. Gini 2013/4 Esercizio 7 G. Gini 2013/4 Soluzione 7 G. Gini 2013/4 Esercizio 8.1 G. Gini 2013/4 Esercizio 8.2 G. Gini 2013/4 Esercizio 9 • Si dimostri per induzione che un grafo con n vertici ha al più n(n-1)/2 archi. Soluzione • Caso base: un grafo con 1 vertice ha 1(1-1)/2=0 archi. Nel caso base il teorema è soddisfatto. • Ipotesi di induzione: un grafo con n vertici ha al più n(n1)/2 archi. • Passo induttivo: Aggiungiamo un nuovo vertice al grafo con n vertici. Possiamo aggiungere al massimo altri n archi, tra il nuovo vertice e ciascuno degli n vertici già presenti. Quindi: • E(n + 1) ≥ E(n) + n ≥ n(n − 1)/2 + n = (n2 + n)/2 = n(n + 1)/2 G. Gini 2013/4 Esercizio 10 • Sia dato un grafo G = (V, E) non orientato e connesso, avente n = |V| > 0 vertici ed m = |E| archi. • Si dimostri che deve necessariamente valere la relazione m ≥ n – 1. Si suggerisce di fornire una dimostrazione per induzione sul numero dei vertici del grafo. G. Gini 2013/4 Soluzione 10 • • • • Caso Base n = 1, m = 0 e` banalmente verificata. Ipotesi induttiva: m(n) >= n-1 o anche m(n)+1 >= n Tesi: m(n+1) >= (n+1) – 1 Dimostrazione: se aggiungo un vertice al grafo perché sia connesso devo aggiungere almeno un arco da quel vertice a un vertice preesistente. Quindi m(n+1) >= m(n)+1. Da ciò mettendo insieme la tesi m(n+1) >= m(n)+1 >= n cioè prendendo il primo e l'ultimo termine della disuguaglianza m(n+1) >= n che è la tesi. G. Gini 2013/4 Esercizio 11 • • • • • • • Sia G un grafo con n nodi ed m archi. Dire se le seguenti affermazioni sono vere o false e giustificare la propria risposta: tutte le foreste generate da differenti visite in profondità hanno lo stesso numero di alberi; tutte le foreste generate da differenti visite in profondità hanno lo stesso numero di spigoli dell’albero e lo stesso numero di spigoli all’indietro. SOLUZIONE. Si ricordi che, dato un grafo G con k componenti connesse, qualsiasi foresta ricoprente (che sia generata da una visita in profondità o no) è formata esattamente da k alberi, uno per ciascuna componente connessa. Da questa semplice osservazione si deduce che la risposta al primo quesito è affermativa. Anche la risposta al secondo quesito è affermativa; infatti ogni albero con a nodi ha a-1 spigoli, ed ogni foresta di k alberi con n nodi ha n-k spigoli. Pertanto il numero di spigoli dell’albero è uguale per tutte le foreste (sia quelle generate da visita in profondità che le altre). Per quanto riguarda gli spigoli all’indietro, si ricordi che una visita in profondità non produce spigoli di attraversamento, e quindi tutti gli spigoli non dell’albero sono all’indietro; ne consegue che tutte le foreste generate da differenti visite in profondità hanno m-(n-1) spigoli all’indietro. Concludendo, mentre le proprietà descritte dalla prima affermazione e dalla parte della seconda affermazione riguardante gli spigoli dell’albero sono proprietà valide per tutti gli alberi ricoprenti, indipendentemente dal fatto che essi scaturiscano da una visita in profondità o no, la proprietà sugli archi all’indietro relativa alla seconda affermazione si basa pesantemente sulle proprietà degli alberi generati da visita in profondità. G. Gini 2013/4
© Copyright 2024 Paperzz