Documente Academic
Documente Profesional
Documente Cultură
Arbori [i arborescen]e
1. T:= G
2. while ( ∃ e ∈ E(T) astfel încât T \ {e} este conex) do
T := T \ {e}
Graful T obţinut este graf parţial al lui G, este conex (din ipoteză, după
atribuirea din 1, aşa este şi din condiţia lui while, T este conex după fiecare
iteraţie) şi în plus la oprirea algoritmului, T satisface condiţia ii) din teorema 1,
deci este arbore.
arbore parţial}
prelucrează T ( listează, memorează etc.)
end
else if i = 1 then for j := 1 to dG(v0) do begin
T[i] := j; A:
generare-arbori-parţiali(i + 1); B:
end
else for j := T[i - 1] to m do
if 〈 {T[1], . . . , T[i - 1]} ∪ {j} 〉 G nu are circuite
then begin
T[i] := j; A:
generare -arbori-parţiali(i + 1); B:
end
end.
1
6
atunci arborii generaţi sunt următorii 16: 123, 125, 126, 134, 136, 145, 146, 156, 234,
235, 245, 246, 256, 345, 346, 356.
Pentru implementarea eficientă a testului dacă graful parţial
〈 {T[1], . . . , T[i - 1]} ∪ {j} 〉 G nu are circuite să observăm că din construcţie,
〈 {T[1], . . . , T[i - 1]} 〉 G
nu are circuite, deci componentele sale conexe sunt arbori.
Vom considera o variabilă globală rad = array[1..n] of V cu semnificaţia rad[v] =
rădăcina arborelui la care aparţine vârful v (unul din vârfurile acestui arbore).
Înaintea apelului generare-arbori-parţiali(1) se iniţializează rad[v] := v
( ∀v ∈V), ceea ce corespunde faptului că {T[1], . . . , T[i - 1]= 0.
Dacă în cursul apelurilor (recursive) se încearcă plasarea muchiei j la
38
mulţimea curentă T[1], . . . , T[i - 1], fie v= E[j,1] şi w=E[j, 2] Atunci 〈 {T[1], . . . ,
T[i - 1]} ∪ {j} 〉 G nu are circuite dacă şi numai dacă muchia vw nu are extremităţile
în aceeaşi componentă a lui
〈 {T[1], . . . , T[i - 1]} 〉 G,
adică dacă şi numai dacă rad[v] ≠ rad[w].
Vectorul rad trebuie întreţinut pentru a avea semnificaţia dorită. Acest lucru se
obţine înlocuind în procedura descrisă, instrucţiunile (vide) etichetate A şi B.
Astfel: A; se va înlocui cu secvenţa
S := ∅; x :=rad[v ];
for u∈V do if rad [u]= x then begin
S := S ∪ {u};
rad[u] := rad[w];
end
{ }
| TG | = det(M[G]ii) ∀i ∈ 1,..., n .
n − 1 −1 L −1
−1 O N M
det(M[Kn]11) = = nn-2
M N O −1
−1 L −1 n − 1
(P1)
Date: G = (V, E) graf şi c: E -> R (c(e) - costul muchiei e).
Să se determine T*∈ TG astfel încât c(T*) = min{c(T) | T ∈ TG},
unde c(T) = ∑ c(e) .
e∈E (T )
n−k
minim al lui G, astfel încât E(Tk)= U E(Tik)⊆ E(T*).
i =1
Descrierea algoritmului.
begin
1: Vs := {s}; {s ∈ V, oarecare}.
Es := ∅;
for v ∈ V\ {s} do begin α[v] := s; β[v] := c(sv) end;
{ dac\ ij ∉ E atunci c(ij) = ∞ }
2: while Vs ≠ V do begin
determin\ j*∈ V \ Vs; β[j*] = min{β[j] | i ∈ V - Vs};
Vs := Vs ∪ {j*};
41
Es := Es ∪ {α[j*]j*};
for j ∈ V – Vs do if β[j] > c(j*j) then begin
β[j] := c(j*j);
α[j] := j*;
end
end
end.
begin
1. Sorteaz\ E = (e1, e2, ..., em) astfel încât:
c(e1) ≤ c(e2) ≤ ... ≤ c(em ).
1.2 T := ∅; i:= 1;
2. while i ≤ m do begin
if 〈T ∪ {ei}〉G nu are circuite then
T := T ∪ {ei};
i :=i + 1;
end
end.
2. while i ≤ m do begin
fie ei = vw;
if find(v) ≠ find(w) then union(u,w);
i := i + 1;
end
care corespunde familiei T0. Func]ia find are în acest caz comlpexitatea O(1) [i
este:
function find(v: V): V;
begin
find := rad[v];
end.
Pasul 2 al algoritmului necesit\ O(m) apeluri ale func]iei find (exact m a[a
cum l-am descris, sau O(m) dac\ se introduce un test asupra cardinalului mul]imii
T curente). ~n secven]a acestor O(m) apeluri ale func]iei find se vor intercala n – 1
apeluri ale procedurii union. Rezult\ c\ `n total pasul 2 necesit\ O(m + (n-1)O(n))
= O(n2) opera]ii. Deci complexitatea algoritmului este O(max(mlogn, n2)). Dac\
graful este plin, m = O(n2), se observ\ c\ acest algoritm este mai pu]in eficient
43
2. while i ≤ m do begin
fie ei = vw;
x := find(v);
y := find(w);
if x ≠ y then union(u,w);
i := i + 1;
end
Evident, complexitatea procedurii union este O(1). Func]ia find este `n acest caz
mai complicat\:
Complexitatea lui find(v) este O(h(v)) unde h(v) este lungimea drumului
din arborelee care-l con]ine pe v de la vârful v la r\d\cina acestui arbore. Dac\
graful G este K1,n-1 desenat mai jos,
3
1
44
[i lista ordonat\ a muchiilor E = {12, 13, ..., 1n}, atunci execu]ia algoritmului
provoac\ urm\torul [ir de apeluri ale procedurii union(U) [i functiei find(F):
F(1), F(2), U(1,2), F(1), F(3), U(2,3), F(1), F(4), U(3,4),..., F(1), F(n), U(n-1,n).
Apelurile F(i) (i > 1) [i U(i, i+1) i ≥ 1necesit\ `n total O(n) opera]ii. {irul de F(1)
necesit\ `ns\ O(1 + 2 + ... + n – 1) = O(n2) opera]ii.
Este deci posibil ca pasul 2 al algoritmului `n aceast\ implementare s\ fie de
complexitate Ω(n2) chiar dac\ graful este rar.
Deficien]a acestei implement\ri este datorat\ posibilit\]ii ca `n procedura
union s\ declar\m r\d\cin\ nou\ pentru cei doi arbori pe cea a celui cu mai pu]ine
vârfuri, ceea ce are ca efect posibilitatea ca h(v) s\ devin\ mare , O(n), pe parcursul
algoritmului. Aecst defect poate fi evitat dac\ la execu]ia lui union ]inem seama de
cardinalul celor dou\ mul]imi. Se poate memora cardinalul unei mul]imi `n
componenta tabloului pred corespunz\toare r\d\cinii arborelui care memoreaz\
acea mul]ime. Mai precis, consider\m ini]ializarea
end.
avem: Complexitatea pasului 2, utilizând union din solu]ia a II-a [i find descris
mai sus, este O(mα(m, n)). Not\m c\ α(m, n) cre[te extrem de `ncet (pentru
valorile practice ale lui n, α(m, n) ≤ 3 [i deci se obtine ca aceast\ ultim\
implementare este practic liniar\ (`n raport cu m).
Arborescen]e
begin
1: T := {v1, v2} ∪ {z}; v0 :=z;
2: while T ≠ V do begin
fie u ∈ V – T;
47
(I) ∀t ∈ T, D v0t ≠ ∅
Dup\ fiecare itera]ie din pasul 2, m\car un vârf se adaug\ la T [i `n plus condi]ia
(I) r\mâne satisf\cut\. Rezult\ c\ vârful v0 construit de algoritm este r\d\cin\ a
digrafului G.
Are loc urm\toarea teorem\ de caracterizarea arboresce]elor.
Teorema 4. Fie H = (V, E) graf orientat cu n ≥ 2 vârfuri. Urm\toarele afirma]ii sunt
echivalente:
(i) H este quasi-tare conex [i G(H) nu are circuite.
(ii) H este quasi-tare conex [i are n – 1 arce.
(iii) H este arborescen]\.
(iv) ∃v0 ∈ V astfel `ncât ∀v∈ V |D v0 v | = 1.
(v) H este quasi-tare conex[i minimal cu aceast\ proprietate (∀e∈
E,
H – e nu este tare conex).
(vi) H conex [i ∃v0 ∈ V astfel `ncât dH-(v0) = 0 [i ∀v ≠ v0 dH-(v) = 1
(vii) G(H) nu are circuite [i ∃v0 ∈ V astfel `ncât dH-(v0) = 0 [i ∀v ≠ v0
-
dH (v) = 1
Demonstra]ia acestei teoreme este simpl\ ( i ⇒ ii ⇒ ... ⇒ vii ⇒ i) [i o
omitem.
Defini]ie. Fie G =(V, E) un digraf. Se nume[te arborescen]\ par]ial\ a lui G
un digraf par]ial H = (V, E’) (E’ ⊆ E) cu proprietatea c\ H este arborescen]\. Not\m
O aplica]ie `n informatic\.
Gr\mezi.
2 3
4 6 7
5
8 9 10
s\i).
procedure heapsort(A,n);
{ sorteaz\ descresc\tor A[1..n] }
begin
balg(A,n);
for i = n downto 2 do begin
t := A[i]; A[i] := A[1]; A[1] := t;
combg(A,i-1);
end
51
end.