Transcript Structuri arborescente
Slide 1
Structuri arborescente
(grafuri de tip arbore)
Slide 2
Structuri arborescente
• Definiţie. Graful 𝐺 este arbore dacă 𝐺 este aciclic şi conex.
1
1
2
4
3
4
2
7
5
5
1
3
6
7
7
4
3
7
2
5
9
6
8
Slide 3
Structuri arborescente
• Definiţie. Fie 𝐺 = (𝑉, 𝐸) graf arbore. Subgraful 𝐻 = (𝑉1, 𝐸1)
al lui 𝐺 este subarbore al lui 𝐺 dacă 𝐻 este graf arbore.
1
1
2
2
8
3
𝑮
3
4
𝑯𝟏
5
6
4
5
7
6
9
9
1
1
2
2
8
3
𝑯𝟐
3
4
𝑯𝟑
5
6
7
9
4
Slide 4
Structuri arborescente
• Fie 𝐺 = (𝑉, 𝐸) un graf. Următoarele afirmaţii sînt echivalente:
– 𝐺 este graf arbore (aciclic şi conex);
– 𝐺 este graf conex minimal: prin eliminarea oricărei muchii,
graful rezultat nu este conex;
– 𝐺 este graf aciclic maximal:
𝑛 = 9prin adăugarea unei noi
muchii în graf rezultă cel
𝑚 puţin
= 8 un ciclu.
1
• Cum verificăm dacă un graf2 este arbore?
– Verificare conexitate + verificare aciclicitate (alg. Marimont) 8
– Verificare aciclicitate şi 𝑛 = 𝑚 +13 (n – nr. vîrfuri, m – nr. muchii)
4
– Verificare conexitate şi 𝑛 = 𝑚 +1
5
6
7
9
Slide 5
Structuri arborescente
• Definiţie. Se numeşte graf asimetric un digraf 𝐷 = (𝑉, 𝐸) cu
proprietatea că pentru orice 𝑢𝑣 ∈ 𝐸, 𝑣𝑢 ∉ 𝐸.
• Digraful D este simetric dacă pentru orice 𝑢𝑣 ∈ 𝐸 şi 𝑣𝑢 ∈ 𝐸.
2
2
1
1
5
6
3
3
4
Graf
asimetric
5
6
7
4
7
Graf
simetric
Slide 6
Structuri arborescente
• Definiţie. Fie 𝐷 = (𝑉, 𝐸) digraf netrivial. Graful 𝐺 = (𝑉, 𝐸’),
unde 𝐸’ = {𝑢𝑣|𝑢𝑣𝐸 𝑠𝑎𝑢 𝑣𝑢𝐸} se numeşte graf suport al
digrafului D.
2
Graf suport
1
5
6
2
1
3
4
5
6
7
3
4
7
Slide 7
Structuri arborescente
• Definiţie. Un arbore direcţionat este un graf orientat
asimetric pentru care graful suport corespunzător este graf
arbore.
• Definiţie. Arborele direcţionat 𝑇 = (𝑉, 𝐸) este arbore cu
rădăcină dacă există 𝑟 ∈ 𝑉 astfel încît, pentru orice 𝑢 ∈ 𝑉,
GS
1
1
𝑢G1≠ 𝑟, există
r-u drum în8 𝑇. Vîrful
r se numeşte
rădăcina8
4
4
arborelui
direcţionat 𝑇 (drumurile2sînt unice, rădăcina este
2
unică; lungimea
unui drum
este egală cu numărul
de arce).
3
7
3
7
G2
1
8
10
1
8
10
4
4
Pentru
un arbore
5
5
2
2
• Definiţie.
Fie 𝑇 = (𝑉, 𝐸) arbore direcţionat.
6
cu rădăcină, 6orice 9 7
Arborele 𝑇31 = (𝑉1,10𝐸1) este
subarbore al lui3 T dacă10
este
rădăcina
𝑉nod
⊆
𝑉,
𝐸
𝐸 asimetric
şi T1 este arbore direcţionat.
Graf
orientat
Graf suport
direcţionat
1Arbore
1 ⊆
5
unui5 subarbore.
6
9
Graf orientat
asimetric
Arbore
direcţionat
cu rădăcină
6
9
7
9
Subarbori (G1, G1/G2)
Slide 8
Reprezentări şi parcurgeri (arbori orientaţi)
“…lungimea unui drum
egală
cu numărul
• Definiţie. Un arbore orientat este un este
arbore
direcţionat
cu de
1
1
arce.”
rădăcină.
4 arbore orientat
2
3
4 r. Un
• Definiţie.2 Fie 𝑇 =3(𝑉, 𝐸) un
cu rădăcină
vîrf v este situat pe nivelul i al arborelui T, dacă distanţa de
la vîrf la rădăcină este egală cu i. Rădăcina arborelui este
5
6
7pe nivelul 0. 8
considerată
5
6
7
8
9
10
11
12
13
14
15 9 16 10
11
12
13
14
15
16
• Se pot folosi toate tipurile de reprezentare a grafurilor, plus
metode specifice arborilor.
Slide 9
Reprezentarea Fiu-Frate
• N: numărul de noduri
din partea stîngă, conform
reprezentării grafice
• R: eticheta nodul rădăcină
• FIU(i): eticheta primului descendent al vîrfului i
Atenție la translația
etichetă
indice
vector
care
urmează imediat
lui i
• FRATE(i): eticheta vîrfului descendent al tatălui vîrfului i şi
• INF(i): informaţia ataşată vîrfuluispre
i dreapta, conform
reprezentării grafice
• adesea informaţia e chiar valoarea i, caz în care
vectorul INF nu mai e necesar
• Valoare lipsă (fiu, frate): se foloseşte o valoare
convenţională (0, -1…)
Slide 10
Reprezentarea Fiu-Frate
1
N = 16,
R=1
2
3
4
Putem afla tatăl unui nod?
9
5
6
7
10
11
12
8
13
14
15
Putem afla descendenţii unui nod?
16
1 2 3 4 5 6 7
FIU
8
9 10 11 12 13 14 15 16
=(2,5,0,8,0,9,0,14, 0, 0, 0, 0, 0, 0, 0, 0)
FRATE =(0,3,4,0,6,7,0, 0,10,11,12,13, 0,15,16, 0)
Slide 11
Reprezentare folosind structuri
dinamice
• Presupunînd că fiecare
vîrf al arborelui are cel mult n
Adr. Adr. Adr.
1 fiu 1 fiu 2 fiu 3 Null Null
descendenţi, fiecărui vîrf îi este asociată structura
2
Adr.
fiu 1
Adr.
fiu 2
Adr.
fiu 3
Null
,
7
6
5
Null
3
Null
Adr.
fiu 1
identificator
Null Null Null Null
vîrf
Null
Adr.
fiu 2
Null
Null
Null
Null
Null
Null
Null
Null
Null
4
Adr.
fiu 1
Null
Null
Null
Null
8
Adr.
fiu 1
Adr.
fiu 2
Adr.
fiu 3
Null
Null
Adr. Adr. de legături către descendenţii vîrfului
vector
fiu 4 fiu 5
Adr.
fiu 3
16
adresă fiu 1
…
13
Null
Null
Null
Null
12
Null
Null
Null
Null
Null
11
Null
Null
Null
Null
Null
10
Null
Null
Null
Null
Null
Null
Null
Null
Null
Null
15
Null
Null
Null
Null
Null
adresă
fiuNulln
Null Null Null
Null
14
9
Null
Null
Null
Null
Null
Null
Slide 12
Parcurgeri
• Aplicarea sistematică a unei reguli de vizitare a
vîrfurilor arborelui.
• Cele mai utilizate reguli de parcurgere a arborilor
orientaţi sînt
– A-preordine (variantă DF)
– A-postordine (variantă DF)
– parcurgerea pe niveluri (BF)
Slide 13
Parcurgerea în A-preordine (Fiu-Frate)
• Se vizitează vîrful curent şi se identifică descendenţii lui.
Se aplică aceeaşi regulă de vizitare pentru fiecare dintre
arborii avînd ca rădăcini descendenţii vîrfului curent.
1
void A_preordine (nod R)
{ if (R)
{ vizit (R);
A_preordine(FIU[R]);
A_preordine(FRATE[R]);
}
}
2
9
3
5
6
7
10
11
12
1, 2, 5, 6, 9, 10, 11, 12, 13, 7, 3, 4, 8, 14, 15, 16
4
8
13
14
15
16
Slide 14
Parcurgerea în A-postordine (Fiu-Frate)
• Se identifică şi se vizitează descendenţii vîrfului curent,
apoi se vizitează vîrful curent. Se aplică aceeaşi regulă de
vizitare pentru arborii avînd ca rădăcini descendenţii vîrfului
curent.
1
void A_postordine (nod R)
{ if (R)
{ A_postordine(FIU[R]);
vizit (R);
A_postordine(FRATE[R]);
}
2
9
3
5
6
7
10
11
12
}
5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1
4
8
13
14
15
16
Slide 15
Parcurgeri în adîncime (str. dinamice)
void A_preordine (nod R)
{ if (R)
{ vizit (R);
for(i=0;i A_preordine(R->leg[i]);
}
}
void A_postordine (nod R)
{ if (R)
{ for(i=0;i A_postordine(R->leg[i]);
vizit (R);
}
}
Slide 16
Parcurgerea pe niveluri (Fiu-Frate)
void parcurgere_pe_niveluri(nod R, int FIU[],
int FRATE[], int n)
{ TNOD* C = NULL;
1
push(C,R);
while (C)
{ pop(C,v);
2
3
4
VIZIT(v);
v=FIU[v];
5
6
7
8
while(v)
{ push(C,v);
v=FRATE[v];
14
15
16
9
10
11
12
13
}
}
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Slide 17
Parcurgerea pe niveluri (str. dinamice)
void parcurgere_pe_niveluri(nod *R)
{ TNOD* C = NULL;
push(C,R);
while (C)
2
{ pop(C,v);
VIZIT(v);
for(i=0;i 5
6
if(R->leg[i])
push(C,R->leg[i]);
}
9
10
11
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
1
3
4
7
12
8
13
14
15
16
Slide 18
Arbori parţiali
• Definiţie. Fie 𝐺 un graf. Subgraful parţial 𝐻 este un arbore
parţial al lui 𝐺 dacă 𝐻 este graf arbore.
• Definiţie. Fie 𝐺 = (𝑉, 𝐸, 𝑤) un graf ponderat conex. Dacă
𝑇 = (𝑉, 𝐸0) este un arbore parţial al grafului 𝐺’ = (𝑉, 𝐸),
ponderea arborelui 𝑇, notată 𝑊(𝑇), este definită prin
𝑊(𝑇) =
𝑤(𝑒)
𝑒∈𝐸0
• Definiţie. Arborele parţial 𝑇0 ∈ 𝑇(𝐺) este arbore parţial
minim pentru 𝐺 dacă 𝑊(𝑇0) = min{𝑊(𝑇); 𝑇 ∈ 𝑇(𝐺)}, unde
𝑇(𝐺) este mulţimea arborilor parţiali ai grafului 𝐺.
Slide 19
Arbori parţiali
P = 22
1
1
1
1
4
4
4
4
3
2
3
2
3
3
3
7
8
2
3
8
3
3
6
6
2
5
4
P = 20
2
5
7
4
P = 15
1
7
1
1
1
4
4
2
4
2
3
3
3
7
3
2
3
6
5
6
7
2
3
5
2
4
7
Slide 20
Algoritmul lui Kruskal
Problemă: determinarea arborelui parţial de cost minim 𝑇 =
𝑉, 𝐸 al grafului 𝐺 = (𝑉′, 𝐸′).
Algoritm:
• se iniţializează 𝐸 = ∅ iar 𝑉 = 𝑉’.
• dintre arcele disponibile (neselectate anterior) se alege
arcul cu ponderea cea mai mică şi care nu formează un
ciclu prin adăugare la arbore
• repetă pasul anterior de 𝑛– 1 ori
Slide 21
Algoritmul lui Kruskal
1
4
2
8
Nr. arc
curent
Nr. arce
selectate
0
1
2
3
4
5
0
1
2
3
4
4
5
12
1
4
Arc
curent
i j
8
6
9
2
4
3
2
arc
(2,3)
(1,6)
(2,4)
(1,5)
(3,4)
(1,2)
3
Vectorul
Tata
1
(-1,
(-1,
(-2,
(-2,
(-3,
(-6,
2
2
1
2
1
3
1
4
5
3
3
3 1
6 2
4 2
5 3
4 4
2 4
6 8
6 8
6 9
5 12
3
4
v
v
v
v
x
v
1
4
2
6
-1, -1, -1, -1, -1)
-2, 2, -1, -1, -1)
-2, 2, -1, -1, 1)
-3, 2, 2, -1, 1)
-3, 2, 2, 1, 1)
1,
2,
2,
6
2
5
1,
1)
3
2
1
4
3
cost
total
1
2
2
3
4
0
1
3
5
8
8
12
5
Slide 22
Algoritmul lui Kruskal
• Funcţie pentru determinarea rădăcinii
int radacina(int v,int tata[])
{ int u = v;
while(tata[u] >= 0)
u = tata[u];
return u;
}
1
2
Ex.: v = 4
(-6, 1,
u = 4 tata[4]=2
u = 2 tata[2]=1
u = 1 tata[1]=-6 < 0
3
4
5
6
2,
2,
1,
1)
Slide 23
Algoritmul lui Kruskal
int kruskal(int a[][3],int nm, int nv, int b[][3])
{ int tata[50],i,j, v1, v2, r1, r2;
int c=0;
for(i=0; i for(i=j=0; j { v1=a[i][0]; v2=a[i][1];
r1=radacina(v1,tata); r2=radacina(v2,tata);
if( r1 != r2 )
{ if( tata[r1] < tata[r2] )
{ tata[r1]+=tata[r2]; tata[r2]=r1; }
else
{ tata[r2]+=tata[r1]; tata[r1]=r2; }
b[j][0]=a[i][0]; b[j][1]=a[i][1];
b[j][2]=a[i][2];
c+=a[i][2];
j++;
}
}
return c;
}
Slide 24
Spor la învăţat!
Structuri arborescente
(grafuri de tip arbore)
Slide 2
Structuri arborescente
• Definiţie. Graful 𝐺 este arbore dacă 𝐺 este aciclic şi conex.
1
1
2
4
3
4
2
7
5
5
1
3
6
7
7
4
3
7
2
5
9
6
8
Slide 3
Structuri arborescente
• Definiţie. Fie 𝐺 = (𝑉, 𝐸) graf arbore. Subgraful 𝐻 = (𝑉1, 𝐸1)
al lui 𝐺 este subarbore al lui 𝐺 dacă 𝐻 este graf arbore.
1
1
2
2
8
3
𝑮
3
4
𝑯𝟏
5
6
4
5
7
6
9
9
1
1
2
2
8
3
𝑯𝟐
3
4
𝑯𝟑
5
6
7
9
4
Slide 4
Structuri arborescente
• Fie 𝐺 = (𝑉, 𝐸) un graf. Următoarele afirmaţii sînt echivalente:
– 𝐺 este graf arbore (aciclic şi conex);
– 𝐺 este graf conex minimal: prin eliminarea oricărei muchii,
graful rezultat nu este conex;
– 𝐺 este graf aciclic maximal:
𝑛 = 9prin adăugarea unei noi
muchii în graf rezultă cel
𝑚 puţin
= 8 un ciclu.
1
• Cum verificăm dacă un graf2 este arbore?
– Verificare conexitate + verificare aciclicitate (alg. Marimont) 8
– Verificare aciclicitate şi 𝑛 = 𝑚 +13 (n – nr. vîrfuri, m – nr. muchii)
4
– Verificare conexitate şi 𝑛 = 𝑚 +1
5
6
7
9
Slide 5
Structuri arborescente
• Definiţie. Se numeşte graf asimetric un digraf 𝐷 = (𝑉, 𝐸) cu
proprietatea că pentru orice 𝑢𝑣 ∈ 𝐸, 𝑣𝑢 ∉ 𝐸.
• Digraful D este simetric dacă pentru orice 𝑢𝑣 ∈ 𝐸 şi 𝑣𝑢 ∈ 𝐸.
2
2
1
1
5
6
3
3
4
Graf
asimetric
5
6
7
4
7
Graf
simetric
Slide 6
Structuri arborescente
• Definiţie. Fie 𝐷 = (𝑉, 𝐸) digraf netrivial. Graful 𝐺 = (𝑉, 𝐸’),
unde 𝐸’ = {𝑢𝑣|𝑢𝑣𝐸 𝑠𝑎𝑢 𝑣𝑢𝐸} se numeşte graf suport al
digrafului D.
2
Graf suport
1
5
6
2
1
3
4
5
6
7
3
4
7
Slide 7
Structuri arborescente
• Definiţie. Un arbore direcţionat este un graf orientat
asimetric pentru care graful suport corespunzător este graf
arbore.
• Definiţie. Arborele direcţionat 𝑇 = (𝑉, 𝐸) este arbore cu
rădăcină dacă există 𝑟 ∈ 𝑉 astfel încît, pentru orice 𝑢 ∈ 𝑉,
GS
1
1
𝑢G1≠ 𝑟, există
r-u drum în8 𝑇. Vîrful
r se numeşte
rădăcina8
4
4
arborelui
direcţionat 𝑇 (drumurile2sînt unice, rădăcina este
2
unică; lungimea
unui drum
este egală cu numărul
de arce).
3
7
3
7
G2
1
8
10
1
8
10
4
4
Pentru
un arbore
5
5
2
2
• Definiţie.
Fie 𝑇 = (𝑉, 𝐸) arbore direcţionat.
6
cu rădăcină, 6orice 9 7
Arborele 𝑇31 = (𝑉1,10𝐸1) este
subarbore al lui3 T dacă10
este
rădăcina
𝑉nod
⊆
𝑉,
𝐸
𝐸 asimetric
şi T1 este arbore direcţionat.
Graf
orientat
Graf suport
direcţionat
1Arbore
1 ⊆
5
unui5 subarbore.
6
9
Graf orientat
asimetric
Arbore
direcţionat
cu rădăcină
6
9
7
9
Subarbori (G1, G1/G2)
Slide 8
Reprezentări şi parcurgeri (arbori orientaţi)
“…lungimea unui drum
egală
cu numărul
• Definiţie. Un arbore orientat este un este
arbore
direcţionat
cu de
1
1
arce.”
rădăcină.
4 arbore orientat
2
3
4 r. Un
• Definiţie.2 Fie 𝑇 =3(𝑉, 𝐸) un
cu rădăcină
vîrf v este situat pe nivelul i al arborelui T, dacă distanţa de
la vîrf la rădăcină este egală cu i. Rădăcina arborelui este
5
6
7pe nivelul 0. 8
considerată
5
6
7
8
9
10
11
12
13
14
15 9 16 10
11
12
13
14
15
16
• Se pot folosi toate tipurile de reprezentare a grafurilor, plus
metode specifice arborilor.
Slide 9
Reprezentarea Fiu-Frate
• N: numărul de noduri
din partea stîngă, conform
reprezentării grafice
• R: eticheta nodul rădăcină
• FIU(i): eticheta primului descendent al vîrfului i
Atenție la translația
etichetă
indice
vector
care
urmează imediat
lui i
• FRATE(i): eticheta vîrfului descendent al tatălui vîrfului i şi
• INF(i): informaţia ataşată vîrfuluispre
i dreapta, conform
reprezentării grafice
• adesea informaţia e chiar valoarea i, caz în care
vectorul INF nu mai e necesar
• Valoare lipsă (fiu, frate): se foloseşte o valoare
convenţională (0, -1…)
Slide 10
Reprezentarea Fiu-Frate
1
N = 16,
R=1
2
3
4
Putem afla tatăl unui nod?
9
5
6
7
10
11
12
8
13
14
15
Putem afla descendenţii unui nod?
16
1 2 3 4 5 6 7
FIU
8
9 10 11 12 13 14 15 16
=(2,5,0,8,0,9,0,14, 0, 0, 0, 0, 0, 0, 0, 0)
FRATE =(0,3,4,0,6,7,0, 0,10,11,12,13, 0,15,16, 0)
Slide 11
Reprezentare folosind structuri
dinamice
• Presupunînd că fiecare
vîrf al arborelui are cel mult n
Adr. Adr. Adr.
1 fiu 1 fiu 2 fiu 3 Null Null
descendenţi, fiecărui vîrf îi este asociată structura
2
Adr.
fiu 1
Adr.
fiu 2
Adr.
fiu 3
Null
,
7
6
5
Null
3
Null
Adr.
fiu 1
identificator
Null Null Null Null
vîrf
Null
Adr.
fiu 2
Null
Null
Null
Null
Null
Null
Null
Null
Null
4
Adr.
fiu 1
Null
Null
Null
Null
8
Adr.
fiu 1
Adr.
fiu 2
Adr.
fiu 3
Null
Null
Adr. Adr. de legături către descendenţii vîrfului
vector
fiu 4 fiu 5
Adr.
fiu 3
16
adresă fiu 1
…
13
Null
Null
Null
Null
12
Null
Null
Null
Null
Null
11
Null
Null
Null
Null
Null
10
Null
Null
Null
Null
Null
Null
Null
Null
Null
Null
15
Null
Null
Null
Null
Null
adresă
fiuNulln
Null Null Null
Null
14
9
Null
Null
Null
Null
Null
Null
Slide 12
Parcurgeri
• Aplicarea sistematică a unei reguli de vizitare a
vîrfurilor arborelui.
• Cele mai utilizate reguli de parcurgere a arborilor
orientaţi sînt
– A-preordine (variantă DF)
– A-postordine (variantă DF)
– parcurgerea pe niveluri (BF)
Slide 13
Parcurgerea în A-preordine (Fiu-Frate)
• Se vizitează vîrful curent şi se identifică descendenţii lui.
Se aplică aceeaşi regulă de vizitare pentru fiecare dintre
arborii avînd ca rădăcini descendenţii vîrfului curent.
1
void A_preordine (nod R)
{ if (R)
{ vizit (R);
A_preordine(FIU[R]);
A_preordine(FRATE[R]);
}
}
2
9
3
5
6
7
10
11
12
1, 2, 5, 6, 9, 10, 11, 12, 13, 7, 3, 4, 8, 14, 15, 16
4
8
13
14
15
16
Slide 14
Parcurgerea în A-postordine (Fiu-Frate)
• Se identifică şi se vizitează descendenţii vîrfului curent,
apoi se vizitează vîrful curent. Se aplică aceeaşi regulă de
vizitare pentru arborii avînd ca rădăcini descendenţii vîrfului
curent.
1
void A_postordine (nod R)
{ if (R)
{ A_postordine(FIU[R]);
vizit (R);
A_postordine(FRATE[R]);
}
2
9
3
5
6
7
10
11
12
}
5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1
4
8
13
14
15
16
Slide 15
Parcurgeri în adîncime (str. dinamice)
void A_preordine (nod R)
{ if (R)
{ vizit (R);
for(i=0;i
}
}
void A_postordine (nod R)
{ if (R)
{ for(i=0;i
vizit (R);
}
}
Slide 16
Parcurgerea pe niveluri (Fiu-Frate)
void parcurgere_pe_niveluri(nod R, int FIU[],
int FRATE[], int n)
{ TNOD* C = NULL;
1
push(C,R);
while (C)
{ pop(C,v);
2
3
4
VIZIT(v);
v=FIU[v];
5
6
7
8
while(v)
{ push(C,v);
v=FRATE[v];
14
15
16
9
10
11
12
13
}
}
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Slide 17
Parcurgerea pe niveluri (str. dinamice)
void parcurgere_pe_niveluri(nod *R)
{ TNOD* C = NULL;
push(C,R);
while (C)
2
{ pop(C,v);
VIZIT(v);
for(i=0;i
6
if(R->leg[i])
push(C,R->leg[i]);
}
9
10
11
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
1
3
4
7
12
8
13
14
15
16
Slide 18
Arbori parţiali
• Definiţie. Fie 𝐺 un graf. Subgraful parţial 𝐻 este un arbore
parţial al lui 𝐺 dacă 𝐻 este graf arbore.
• Definiţie. Fie 𝐺 = (𝑉, 𝐸, 𝑤) un graf ponderat conex. Dacă
𝑇 = (𝑉, 𝐸0) este un arbore parţial al grafului 𝐺’ = (𝑉, 𝐸),
ponderea arborelui 𝑇, notată 𝑊(𝑇), este definită prin
𝑊(𝑇) =
𝑤(𝑒)
𝑒∈𝐸0
• Definiţie. Arborele parţial 𝑇0 ∈ 𝑇(𝐺) este arbore parţial
minim pentru 𝐺 dacă 𝑊(𝑇0) = min{𝑊(𝑇); 𝑇 ∈ 𝑇(𝐺)}, unde
𝑇(𝐺) este mulţimea arborilor parţiali ai grafului 𝐺.
Slide 19
Arbori parţiali
P = 22
1
1
1
1
4
4
4
4
3
2
3
2
3
3
3
7
8
2
3
8
3
3
6
6
2
5
4
P = 20
2
5
7
4
P = 15
1
7
1
1
1
4
4
2
4
2
3
3
3
7
3
2
3
6
5
6
7
2
3
5
2
4
7
Slide 20
Algoritmul lui Kruskal
Problemă: determinarea arborelui parţial de cost minim 𝑇 =
𝑉, 𝐸 al grafului 𝐺 = (𝑉′, 𝐸′).
Algoritm:
• se iniţializează 𝐸 = ∅ iar 𝑉 = 𝑉’.
• dintre arcele disponibile (neselectate anterior) se alege
arcul cu ponderea cea mai mică şi care nu formează un
ciclu prin adăugare la arbore
• repetă pasul anterior de 𝑛– 1 ori
Slide 21
Algoritmul lui Kruskal
1
4
2
8
Nr. arc
curent
Nr. arce
selectate
0
1
2
3
4
5
0
1
2
3
4
4
5
12
1
4
Arc
curent
i j
8
6
9
2
4
3
2
arc
(2,3)
(1,6)
(2,4)
(1,5)
(3,4)
(1,2)
3
Vectorul
Tata
1
(-1,
(-1,
(-2,
(-2,
(-3,
(-6,
2
2
1
2
1
3
1
4
5
3
3
3 1
6 2
4 2
5 3
4 4
2 4
6 8
6 8
6 9
5 12
3
4
v
v
v
v
x
v
1
4
2
6
-1, -1, -1, -1, -1)
-2, 2, -1, -1, -1)
-2, 2, -1, -1, 1)
-3, 2, 2, -1, 1)
-3, 2, 2, 1, 1)
1,
2,
2,
6
2
5
1,
1)
3
2
1
4
3
cost
total
1
2
2
3
4
0
1
3
5
8
8
12
5
Slide 22
Algoritmul lui Kruskal
• Funcţie pentru determinarea rădăcinii
int radacina(int v,int tata[])
{ int u = v;
while(tata[u] >= 0)
u = tata[u];
return u;
}
1
2
Ex.: v = 4
(-6, 1,
u = 4 tata[4]=2
u = 2 tata[2]=1
u = 1 tata[1]=-6 < 0
3
4
5
6
2,
2,
1,
1)
Slide 23
Algoritmul lui Kruskal
int kruskal(int a[][3],int nm, int nv, int b[][3])
{ int tata[50],i,j, v1, v2, r1, r2;
int c=0;
for(i=0; i
r1=radacina(v1,tata); r2=radacina(v2,tata);
if( r1 != r2 )
{ if( tata[r1] < tata[r2] )
{ tata[r1]+=tata[r2]; tata[r2]=r1; }
else
{ tata[r2]+=tata[r1]; tata[r1]=r2; }
b[j][0]=a[i][0]; b[j][1]=a[i][1];
b[j][2]=a[i][2];
c+=a[i][2];
j++;
}
}
return c;
}
Slide 24
Spor la învăţat!