Sunteți pe pagina 1din 56

Curs 8 coninut

Sortare topologic
Arbore de acoperire minim
Algoritmul lui Kruskal
Algoritmul lui Prim

Drumuri minime de surs unic


Algoritmul lui Dijkstra

Cuplaj bipartit maxim


Structuri de date

2013 - 2014

Sortare topologic
Digrafurile aciclice pot modela precedena
ntre evenimente.
O sortare topologic a unui digraf D=
(V, A) este o ordonare a vrfurilor sale
astfel nct dac (i,j) A, atunci i apare
naintea lui j.

Structuri de date

2013 - 2014

Sortare topologic - exemplu


ciorapi

lenjerie

ceas
pantaloni

pantofi
cma

curea

cravat

sacou

ciorapi

lenjerie

pantaloni

pantofi

ceas

cma

curea

cravat

sacou

(Cormen T.H. et al., Introducere n algoritmi)


Structuri de date

2013 - 2014

Sortare topologic
procedure SortareTopologica(D)
begin
1. DFSCompTareConexe(D)
2. Afiseaz vrfurile n ordinea descresctoare a
timpilor finali de vizitare timpFinal[i]
end

Complexitatea: O(n+m)
Structuri de date

2013 - 2014

Sortare topologic - exemplu


11/16

ciorapi 17/18

lenjerie

ceas

12/15 pantaloni

9/10

pantofi 13/14
cma 1/8

6/7

cravat 2/5

curea

sacou 3/4

ciorapi

18

lenjerie

pantaloni

pantofi

ceas

cma

curea

cravat

16

15

14

10

sacou

(Cormen T.H. et al., Introducere n algoritmi)


Structuri de date

2013 - 2014

Arbore de acoperire minim


G=(V,E) graf neorientat i conex.
w:E R+ - funcie de cost
Dac T E, atunci w(T) = w(e)
eT
T

S se gseasc T E a.. graful


A=(V, T) este conex i w(T) minim.

Structuri de date

2013 - 2014

Arbore de acoperire mimin


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

Algoritmul lui Kruskal


procedure AAM-Kruskal(G, w)
begin
1.
2.
3.
4.
5.
6.
7.

T
for i 0 to n-1 do singleton(i)
sorteaz muchiile din E n ordinea cresctoare
a costului w
for (fiecare muchie {i,j} E n ordinea
cresctoare a costului w) do
if (find(i) != find(j)) then
T T {{i,j}}
union(i,j)

O(m lg m)

end
Structuri de date

2013 - 2014

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

10

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

11

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

12

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

13

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

14

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

15

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

16

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

17

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

18

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

19

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

20

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

21

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

22

Algoritmul lui Kruskal - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

23

Algoritmul lui Prim


procedure AAM-Prim(G, w, radacina)
begin
1.
2.

Q CoadaPrioritatiVida() // minim prioritar


for i 0 to n-1 do

3.
cheie[i] ; insereaza(Q, i)
4. cheie[radacina] 0; tata[radacina] -1
5. while (not esteVida(Q)) do
6.
i citeste(Q); elimina(Q)
7.
for (fiecare vrf j n listaDeAdiac(i)) do
8.
if (j Q and w({i,j}) < cheie[j]) then
9.
tata[j] i
10.
cheie[j] w({i,j})

O(m lg n)

end
Structuri de date

2013 - 2014

24

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[(0,0), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,) ]

Structuri de date

2013 - 2014

25

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[(1,4), (2,), (3,), (4,), (5,), (6,), (7,8), (8,) ]

Structuri de date

2013 - 2014

26

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[(2,8), (3,), (4,), (5,), (6,), (7,8), (8,) ]

Structuri de date

2013 - 2014

27

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[(3,7), (4,), (5,4), (6,), (7,8), (8,2) ]

Structuri de date

2013 - 2014

28

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[(3,7), (4,), (5,4), (6,6), (7,7) ]

Structuri de date

2013 - 2014

29

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[(3,7), (4,10), (6,2), (7,7) ]

Structuri de date

2013 - 2014

30

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[(3,7), (4,10), (7,1) ]

Structuri de date

2013 - 2014

31

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[ (3,7), (4,10) ]

Structuri de date

2013 - 2014

32

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[ (4,9) ]

Structuri de date

2013 - 2014

33

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Q=[ ]

Structuri de date

2013 - 2014

34

Algoritmul lui Prim - exemplu


8

9
2
11

8
7

14

10

Structuri de date

2013 - 2014

35

Drumuri minime de surs unic


D=(V,A) digraf i s V vrf surs
w:A R+ - funcie de cost
Costul unui drum minim de la i la j (i, j V):
min w(a), daca exista p drum de la i la j
(i, j) = p a p

,
altfel

S se gseasc (s,i) pentru i = 0,1, ..., n-1

Structuri de date

2013 - 2014

36

Drumuri minime exemplu s=0


6

3
2

4
2
3

Structuri de date

2013 - 2014

37

Drumuri minime exemplu s=0


3
1

3
2

4
2
3

4
5

Structuri de date

2013 - 2014

11

38

Drumuri minime exemplu s=0


3
1

3
2

4
2
3

4
5

Structuri de date

2013 - 2014

11

39

Algoritmul lui Dijkstra


procedure DM-Dijkstra(D, w, radacina)
begin
1.
2.

Q CoadaPrioritatiVida() // minim prioritar


for i 0 to n-1 do

3.
cheie[i] ; insereaza(Q, i); tata[i] -1;
4. cheie[radacina] 0; S
5. while (not esteVida(Q)) do
6.
i citeste(Q); elimina(Q); S S {i}
7.
for (fiecare vrf j n listaDeAdiacExt(i)) do
8.
if (cheie[j] > cheie[i] + w(i,j) then
9.
tata[j] i
10.
cheie[j] cheie[i] + w(i,j)

end
Structuri de date

O(n lg n + m)
2013 - 2014

40

Alg. lui Dijkstra exemplu (s=0)

10

9
4

Q=[(0,0), (1,), (2,), (3,), (4,) ]

Structuri de date

2013 - 2014

41

Alg. lui Dijkstra exemplu


10

10
2

0 0

9
4

Q=[ (1,10), (2,), (3,), (4,5) ]

Structuri de date

2013 - 2014

42

Alg. lui Dijkstra exemplu


8

14

10
2

0 0

9
4

Q=[ (1,8), (2,14), (3,7) ]

Structuri de date

2013 - 2014

43

Alg. lui Dijkstra exemplu


8

13

10
2

0 0

9
4

Q=[ (1,8), (2,13) ]

Structuri de date

2013 - 2014

44

Alg. lui Dijkstra exemplu


8

10
2

0 0

9
4

Q=[ (2,9) ]

Structuri de date

2013 - 2014

45

Alg. lui Dijkstra exemplu


8

10
2

0 0

9
4

Q=[ ]

Structuri de date

2013 - 2014

46

Alg. lui Dijkstra exemplu


8

10
2

0 0

9
4
7

Structuri de date

2013 - 2014

47

Cuplaj bipartit maxim


Un graf bipartit este un graf neorientat G=(V, E),
fr vrfuri izolate, a.. V = L R i toate
muchiile din E sunt ntre L i R.
Un cuplaj n G este o submulime de muchii M a..
pentru fiecare vrf v V, exist cel mult o
muchie n M incident n v.
Un cuplaj M n G este maxim dac pentru orice
alt cuplaj M n G avem |M| |M|.
Un vrf v V este cuplat de cuplajul M dac
exist o muchie n M incident n v.
Structuri de date

2013 - 2014

48

Exemplu
0
2
1
6
5

7
3
4

8
Structuri de date

2013 - 2014

49

Cuplaj bipartit maxim


Fie G = (V, E) un graf bipartit i M un cuplaj n G.
Se numete drum de cretere relativ la M un
drum P n G care leag dou vrfuri necuplate i
care este compus alternativ din muchii din U-M i
M.
Observaii:
|P| este impar;
M = M xor P este un cuplaj n G a.. |M| > |M| .

Corolar: Un cuplaj M n G este maximal dac i


numai dac nu exist n G drumuri de cretere
relative la M.
Structuri de date

2013 - 2014

50

Cuplaj bipartit maxim - algoritm


procedure CuplajBipartitMaxim(G)
begin
1.
2.
3.

M
while (exist P un drum de cretere
relativ la M) do
M M xor P

end
O(m n)

Structuri de date

(Hopcroft & Carp, SIAM J. of Comp.1973)

2013 - 2014

51

Cuplaj bipartit maxim - exemplu


0
2
1
6
5
7
3
4
8
Structuri de date

2013 - 2014

52

Cuplaj bipartit maxim - exemplu


0
2
1
6
5
7
3
4
8
Structuri de date

2013 - 2014

53

Cuplaj bipartit maxim - exemplu


0
2
1
6
5
7
3
4
8
Structuri de date

2013 - 2014

54

Cuplaj bipartit maxim - exemplu


0
2
1
6
5
7
3
4
8
Structuri de date

2013 - 2014

55

Cuplaj bipartit maxim - exemplu


0
2
1
6
5
7
3
4
8
Structuri de date

2013 - 2014

56

S-ar putea să vă placă și