grafi e cammini

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