Minimo sottografo ricoprenteprofs.scienze.univr.it/~cicalese/ALGORITMI/2014-15/Lec10-MST.pdf · 26...

Post on 15-Aug-2020

1 views 0 download

Transcript of Minimo sottografo ricoprenteprofs.scienze.univr.it/~cicalese/ALGORITMI/2014-15/Lec10-MST.pdf · 26...

18

Minimo sottografo ricoprente

Dato un grafo connesso G = (V, E) con costi positivi sugli archi ce, un minimo

sottografo ricoprente è un insieme di archi E’ ⊆ E tale che:

・ G’ = (V, E’) è connesso

・c(E’) = ∑e ce ≤ c(F) per ogni altro insieme di archi F ⊆ E tale che H = (V, F) è connesso.

16

4

6 23

10

21

14

24

189

7

115

8

19

Minimo sottografo ricoprente

Dato un grafo connesso G = (V, E) con costi positivi sugli archi ce, un minimo

sottografo ricoprente è un insieme di archi E’ ⊆ E tale che:

・ G’ = (V, E’) è connesso

・c(E’) = ∑e ce ≤ c(F) per ogni altro insieme di archi F ⊆ E tale che H = (V, F) è connesso.

16

4

6 23

10

21

14

24

189

7

115

8

Osservazione: G’ = (V, E’) non contiene cicli, quindi è un albero

20

Minimo albero ricoprente

Dato un grafo connesso G = (V, E) con costi positivi sugli archi ce, un minimo

albero ricoprente è un insieme di archi E’ ⊆ E tale che:

・ G’ = (V, E’) è un albero

・c(E’) = ∑e ce ≤ c(F) per ogni altro insieme di archi F ⊆ E tale che H = (V, F) è un albero.

16

4

6 23

10

21

14

24

189

7

115

8

Osservazione: G’ = (V, E’) non contiene cicli, quindi è un albero

MST di costo = 50 = 4 + 6 + 8 + 5 + 11 + 9 + 7

21

Minimo albero ricoprente

Dato un grafo connesso G = (V, E) con costi positivi sugli archi ce, un minimo

albero ricoprente è un insieme di archi E’ ⊆ E tale che:

・ G’ = (V, E’) è un albero

・c(E’) = ∑e ce ≤ c(F) per ogni altro insieme di archi F ⊆ E tale che H = (V, F) è un albero.

16

4

6 23

10

21

14

24

189

7

115

8

Teorema[Cayley]. Un grafo può avere fino a nn–2 alberi ricoprenti

MST di costo = 50 = 4 + 6 + 8 + 5 + 11 + 9 + 7 non possiamo cercarlo esaustivamente

22

Applicazioni

MST è un problema che si ritrova in numerose applicazioni.

・design di reti (telefoniche, idrauliche, stradali)

・clustering.

・compressione dati in proteomica.

・generazione di ipotesi evolutive.

MST su 59 aplotipi di Salmonella Typhi

la lunghezza degli archi rappresenta la

differenza in numero di SNP

23

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

24

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 25

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

26

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 27

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

28

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 29

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

30

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 31

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

32

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 33

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

34

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 35

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

36

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 37

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

38

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 39

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal

40

Algoritmi greedi per MST

Diverse tecniche greedy forniscono una soluzione ottima.

Algoritmo di Prim.

・comincia con un singolo nodo arbitrario s: T = {s}

・aggiungi l’arco di costo minimo con una sola terminazione in T

Algoritmo di Kruskal

・comincia con T = ��・considera gli archi in ordine crescente di costo, aggiungi un arco a T se

non crea un ciclo

16

4

6 23

10

21

14

24

189

7

115

8

16

4

6 23

10

21

14

24

189

7

115

8

Prim Kruskal 41

Osservazioni

Cicli.

・Aggiungendo un arco e ad un albero (ricoprente) T crea un ciclo C.

・Eliminando un arco f ∈ C da T ∪ { e } otteniamo un nuovo albero

ricoprente.

Osservazione. Se ce < cf, allora T NON è un MST.

T = (V, F)

e

f

42

Ottimalità dell’algoritmo di Prim

Teorema. L’algoritmo di Prim produce un MST

Dim

・sia f il primo arco scelto da Prim che non è in un MST

・S è il sottoalbero costruito da Prim che è parte di un MST

・gli archi verdi sono la restante parte di un tale MST T

・se aggiungiamo f creiamo un ciclo

・cf < ce (perché scelto da Prim) quindi T - e ∪ f ha costo inferiore a T

S

e

f

43

Algoritmo di Prim: implementazione

L’algoritmo di Prim può essere implementato in tempo O(m log n).

・quasi identica a quella dell’algoritmo di Dijkstra.

[ d(v) = minimo costo di un arco tra v e S ]

PRIM (V, E, c) _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Crea una coda a priorità S.

s ← un qualsiasi nodo di V.

FOR EACH v ≠ s : d(v) ← ∞; d(s) ← 0.

FOR EACH v : Insert (S, v, d(v)).

WHILE (S is not empty)

(u, d[u]) ← Extract-min(S).

FOR EACH arco (u, v) ∈ Adj[u]:

IF d(v) > c(u, v)

Decrease-val(S, v, c(u, v)).

d(v) ← c(u, v)._________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

44

Algoritmo di Prim - esempio

1 6

4

7 3

9

2

10

11

58 12

13

45

Algoritmo di Prim - esempio

3 11

5

0

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

46

Algoritmo di Prim - esempio

3 11

5

5

3 110

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

47

Algoritmo di Prim - esempio

3

5

113 0

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

48

Algoritmo di Prim - esempio

3

5

11

7

8 12

3 0

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

49

Algoritmo di Prim - esempio

3

5

11

7

8

3 0

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

50

Algoritmo di Prim - esempio

3

5

11

7

8

3

8

7 0

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

51

Algoritmo di Prim - esempio

3

5

113

8

7 0

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

52

Algoritmo di Prim - esempio

3

5

113 0

5

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

53

Algoritmo di Prim - esempio

3

5

113 0

13 2

105

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

54

Algoritmo di Prim - esempio

3

5

113 0

2

105

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

55

Algoritmo di Prim - esempio

3

5

103 0

2

5

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

56

Algoritmo di Prim - esempio

3

5

103 0

2

5

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

57

Algoritmo di Prim - esempio

3

5

103 0

2

5

2

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

58

Algoritmo di Prim - esempio

3

5

103 0

2

5

2

9

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

59

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

8

7

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

60

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

8

77

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

61

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

8

77

1 6

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

62

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

6

77

1

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

63

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

6

77

1

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

64

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

6

77

1

1

4

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

65

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

4

77

1

1

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

66

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

4

77

1

1

4

Comincia con S = un nodo qualsiasi.

Ripeti n – 1 volte:

・Aggiugi all’albero l’arco di minimo costo con un solo vertice in S.

・Aggiungi il nuovo nodo ad S.

67

Algoritmo di Prim - esempio

3

5

93 0

2

5

2

4

77

1

1

4

9

68

Algoritmo di Prim: implementazione

L’algoritmo di Prim può essere implementato in tempo O(m log n).

・quasi identica a quella dell’algoritmo di Dijkstra.

[ d(v) = minimo costo di un arco tra v e S ]

PRIM (V, E, c) _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Crea una coda a priorità S.

s ← un qualsiasi nodo di V.

FOR EACH v ≠ s : d(v) ← ∞; d(s) ← 0.

FOR EACH v : Insert (S, v, d(v)).

WHILE (S is not empty)

(u, d[u]) ← Extract-min(S).

FOR EACH arco (u, v) ∈ Adj[u]:

IF d(v) > c(u, v)

Decrease-val(S, v, c(u, v)).

d(v) ← c(u, v)._________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Running time

T(n) = O(m log n)∑u degree(u) = 2m