Sunteți pe pagina 1din 56

1

11
15
8
10 5 3
2
20
9
5
3
6
4 2
1
11
15
8
10 5 3
2
20
9
5
3
6
4 2
1 s= 1
11
15
8
10 5 3
2
20
9
5
3
6
4 2
1 1
11
15
8
10 5 3
2
20
9
5
3
6
4 2
1 1
11 11
15
8
10 5 3 3
2
20
9
5
3
6
4 2
1 1
11 11
15
8
10 5 3 3
2
20
9
5
3
6
4 2
1 1
11 11
15
8 8
10 5 3 5 3
2
20
9
5
3
6
4 2
1 1
11 11
15
8 8
10 5 3 5 3
2
20
9
5
3
6
4 2
1 1
11 11
15
8 8
10 5 3 5 3
2
20
9 9
5
3
6 6
4 2
1 1
11 11
15
8 8
10 5 3 5 3
2
20
9 9
5
3
6 6
4 2
1 1
11 11
15
8 8
10 5 3 5 3
2
20
9 9
5
3
6 6
4 2 4 2
1 1
11 11
15
8 8
10 5 3 5 3
2
20
9 9
5
3
6 6
4 2 4 2
1 1
11 11
15
8 8
10 5 3 5 3
2 2
20
9 9
5
3 3
6 6
4 2 4 2
s= 1
11
1
11
15 3
8 9
8
10 5 3
2 5
20 6
9
5 2
3
6
4
4 2
3

2
Cum evitm s comparam de fiecare dat
toate muchiile cu o extremitate n arbore
i cealalt nu.
Exemplu:
Dup ce vrfurile 1 i 5 au fost adugate n
arbore, muchiile (2,1) i (2,5) sunt comparate la
fiecare pas, dei w(2,1)>w(2,5), deci (2,1) nu va
fi selectat niciodat
Pentru un vrf (neselectat) memorm doar
muchia minim care l unete cu un vrf din
arbore (selectat)
acest vrf din abore penru care se
realizeaz minimul
Avem
cheie[u] = w(u, tata[u])
Asociem fiecrui vrf urmtoarele informaii
(etichete):
d[u] = costul minim al unei muchii de la u la
un vrf selectat deja n arbore
tata[u] = acest vrf din abore penru care se
realizeaz minimul
Avem

cheie[u] = w(u, tata[u])


Asociem fiecrui vrf urmtoarele informaii
(etichete):
d[u] = costul minim al unei muchii de la u la
un vrf selectat deja n arbore
tata[u] = acest vrf din arbore pentru care se
realizeaz minimul
Avem
cheie[u] = w(u, tata[u])
Avem
d[u] = w(u, tata[u])
(u, tata[u]) este muchia de cost minim de la u la un vrf din arbore
Atunci algoritmul se modific astfel:
La un pas
se alege un vrf u cu eticheta d minim care nu este
nc n arbore i se adaug la arbore muchia (tata[u], u)
Atunci algoritmul se modific astfel:
La un pas
se alege un vrf u cu eticheta d minim care nu este
nc n arbore i se adaug la arbore muchia (tata[u], u)
- se actualizeaz etichetele vrfurilor vV(T) vecine cu
u astfel:
muchia de cost minim
noua muchie: vu determinat pn acum:
(v,tata[v])
muchia de cost minim
noua muchie: vu determinat pn acum:
(v,tata[v])

dac w(u,v) < d[v] atunci


d[v] = w(u,v)
tata[v] = u
Muchiile arborelui vor fi n final
(u, tata[u]), u s
Notm Q=V(G) V(T) = mulimea vrfurilor
neselectate nc n arbore
Prim
s- vrful de start
iniializeaz Q cu V
pentru fiecare uV executa
d[u] = ; tata[u]=0
d[s] = 0
Prim
s- vrful de start
iniializeaz Q cu V
pentru fiecare uV executa
d[u] = ; tata[u]=0
d[s] = 0
cat timp Q executa pentru i = 1, n -1
Prim
s- vrful de start
iniializeaz Q cu V
pentru fiecare uV executa
d[u] = ; tata[u]=0
d[s] = 0
cat timp Q executa
extrage un vrf uQ cu eticheta d[u] minim
Prim
s- vrful de start
iniializeaz Q cu V
pentru fiecare uV executa
d[u] = ; tata[u]=0
d[s] = 0
cat timp Q executa
extrage un vrf uQ cu eticheta d[u] minim
pentru fiecare uvE executa
daca vQ si w(u,v)<d[v] atunci
d[v] = w(u,v)
tata[v] = u
Prim
s- vrful de start
iniializeaz Q cu V
pentru fiecare uV executa
d[u] = ; tata[u]=0
d[s] = 0
cat timp Q executa
extrage un vrf uQ cu eticheta d[u] minim
pentru fiecare uvE executa
daca vQ si w(u,v)<d[v] atunci
d[v] = w(u,v)
tata[v] = u
scrie (u, tata[u]), pentru u s
Cum putem memora Q pentru a determina
eficient vrful uQ cu eticheta minim?
Varianta 1- Folosim vector de vizitat
Q[u] = 1, dac u Q
0, altfel min-ansamblu (heap)
Complexitate

Iniializare
n * extragere vrf minim
actualizare etichete vecini
Complexitate
Varianta 1 cu vector de vizitat
Iniializri ->
n * extragere vrf minim ->
actualizare etichete vecini ->
Complexitate
Varianta 1 cu vector de vizitat
Iniializri -> O(n)
n * extragere vrf minim -> O(n2)
actualizare etichete vecini -> O(m)
O(n2)
1 11
15 8
10 5 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11*/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8*/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1

15 8
10 5 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11*/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8*/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1

15 8
10 5 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: viz [1] = 1 (vom reprezenta prin - )Sel. 3: [
- , 15/1, - , /0, 8*/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1

15 8
10 5 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: actualizm etichetele vecinilorSel. 3: [ - ,
15/1, - , /0, 8*/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1

15 8
10 5 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8*/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8
10 5 3 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8*/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8
10 5 3 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9*/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2
20 9
3 5
4 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2
20 9 9
3 5
4 6 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9/3 ]
Sel. 6: [ - , 5/6 , - , 2*/6 , - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2
20 9 9
3 5
4 6 6
2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9/3 ]
Sel. 6: [ - , 5/6 , - , 2/6, - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2
20 9 9
3 5
6 4 6
4 2 2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9/3 ]
Sel. 6: [ - , 5/6 , - , 2/6, - , - ]
Sel. 4: [ - , 3/5 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2
20 9 9
3 5
6 4 6
4 2 2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9/3 ]
Sel. 6: [ - , 5/6 , - , 2/6, - , - ]
Sel. 4: [ - , 3/4 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2 2
20 9 9
3 5 3
6 4 6
4 2 2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9/3 ]
Sel. 6: [ - , 5/6 , - , 2/6, - , - ]
Sel. 4: [ - , 3/4 , - , - , - , - ]
Sel. 2: [ - , 3/5, - , - , - , - ]
1 11 1 11
15 8 8
10 5 3 5 3
2 2
20 9 9
3 5 3
6 4 6
4 2 2
1 2 3 4 5 6
d/tata= [ 0/0, /0, /0, /0, /0, /0 ]
Sel. 1: [ - , 15/1, 11/1, /0, /0, /0 ]
Sel. 3: [ - , 15/1, - , /0, 8/3, 9/3 ]
Sel. 5: [ - , 10/5 , - , /0, - , 9/3 ]
Sel. 6: [ - , 5/6 , - , 2/6, - , - ]
Sel. 4: [ - , 3/4 , - , - , - , - ]
Sel. 2: [ - , - , - , - , - , - ]
Varianta 2 memorarea vrfurilor din ntr-un
min-heap Q (min-ansamblu)

Iniializare Q -> O(n)


n * extragere vrf minim -> O(n log n)
actualizare etichete vecini -> O(m log n)
O(m log n)
Prim(G, w, s)
pentru fiecare uV executa
d[u] = ; tata[u]=0
d[s] = 0
iniializeaz Q cu V
cat timp Q executa
u=extrage vrf cu eticheta d minim din Q
pentru fiecare v adiacent cu u executa
daca vQ si w(u,v)<d[v] atunci
d[v] = w(u,v)
tata[v] = u
//actualizeaza Q pentru Q heap

scrie (u, tata[u]), pentru u s


Varianta 2 memorarea vrfurilor din ntr-un
min-heap Q (min-ansamblu)

Iniializare Q -> O(n)


n * extragere vrf minim -> O(n log n)
actualizare etichete vecini -> O(m log n)
O(m log n)
Observaie Dac graful este complet (spre exemplu
dac toate punctele se pot conecta i distana dintre
puncte este distana euclidian) m = n(n-1)/2 este de
ordin n2

O(n2) mai eficient

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