Sunteți pe pagina 1din 24

Structuri arborescente

(grafuri de tip arbore)

Structuri arborescente
Definiie. Graful este arbore dac este aciclic i conex.

1 2 3 4

3
4

4
5 6 7

2 5 7

2 5 6 8 9

Structuri arborescente
Definiie. Fie = (, ) graf arbore. Subgraful = (1, 1) al lui este subarbore al lui dac este graf arbore.
1 2 8 2 3 4 5 6 7 1

3 4 5 6

1 2 8 2 3 4 5 6 7

3 4

Structuri arborescente
Fie = (, ) un graf. Urmtoarele afirmaii snt echivalente: este graf arbore (aciclic i conex); este graf conex minimal: prin eliminarea oricrei muchii, graful rezultat nu este conex; este graf aciclic maximal: 9 adugarea unei noi = prin muchii n graf rezult cel puin un ciclu. = 8
1 Cum verificm dac un graf este arbore? 2 Verificare conexitate + verificare aciclicitate (alg. Marimont) 8 3 Verificare aciclicitate i = +1 (n nr. vrfuri, m nr. muchii) 4 Verificare conexitate i = +1 5 6 7

Structuri arborescente
Definiie. Se numete graf asimetric un digraf = (, ) cu proprietatea c pentru orice , . Digraful D este simetric dac pentru orice i .
2 1 5 3 4 7 6
3 4 7 1 5 6 2

Graf asimetric

Graf simetric

Structuri arborescente
Definiie. Fie = (, ) digraf netrivial. Graful = (, ), unde = *| + se numete graf suport al digrafului D.
2 1 5 3 4 7 6

Graf suport

2 1 5 3 4 7 6

Structuri arborescente
Definiie. Un arbore direcionat este un graf orientat asimetric pentru care graful suport corespunztor este graf arbore. Definiie. Arborele direcionat = (, ) este arbore cu rdcin dac exist astfel nct, pentru orice , GS 1 1 G1 , exist r-u drum n8 . Vrful r se numete rdcina8 4 4 arborelui direcionat (drumurile2snt unice, rdcina este 2 unic; lungimea unui drum este egal cu numrul de arce). 3 7 3 7
G2
1 10 4 8 1 10 4 8

Pentru un arbore 5 5 2 2 Definiie. Fie = (, ) arbore direcionat. 6 cu rdcin, 6 orice 9 7 Arborele 3 = (1,10 1) este subarbore al lui3 T dac 10 nod , 1 i T este arbore direcionat. este rdcina 1Arbore asimetric Graf orientat Graf suport 1 direcionat 1 5 5 unui subarbore.
6 9 6

Graf orientat asimetric Arbore direcionat cu rdcin

Subarbori (G1, G1/G2)

Reprezentri i parcurgeri (arbori orientai)


lungimea unui drum Definiie. Un arbore orientat este un este egal cu numrul de arbore direcionat cu 1 1 arce. rdcin.
2 4 2 3 Definiie. Fie =3(, ) un arbore orientat cu rdcin4 r. Un vrf v este situat pe nivelul i al arborelui T, dac distana de la vrf la rdcin este egal cu i. Rdcina arborelui este 5 6 considerat 7 nivelul 0. 8 pe 5 6 7 8

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.

Reprezentarea Fiu-Frate
N: numrul de noduri R: eticheta nodul rdcin FIU(i): eticheta primului descendent al vrfului i FRATE(i): eticheta vrfului descendent al tatlui vrfului i i

din partea stng, conform reprezentrii grafice

Atenie la translaia etichet indice vector care urmeaz imediat lui i

spre INF(i): informaia ataat vrfului i dreapta, conform reprezentrii grafice adesea informaia e chiar valoarea i, caz n care
vectorul INF nu mai e necesar Valoare lips (fiu, frate): se folosete o valoare convenional (0, -1)

Reprezentarea Fiu-Frate
1

N = 16, R=1
4

Putem afla tatl unui nod?


5 6 7 8

Putem afla descendenii unui nod?


16

10

11

12

13

14

15

1 2 3 4 5 6 7

9 10 11 12 13 14 15 16

FIU

=(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)

Reprezentare folosind structuri dinamice


Presupunnd c fiecare vrf Adr. arborelui are cel mult n al Adr. Adr. 1 fiu 1 fiu 2 fiu 3 Null Null descendeni, fiecrui vrf i este asociat structura
2
Adr. fiu 1 Adr. fiu 2 Adr. fiu 3 Null Null

Null

Null

Null

Null

Null

Adr. fiu 1

Null

Null

Null

Null

7 6 5
Null Adr. fiu 1

Null Adr. fiu 2

Null Adr. fiu 3

Null

Null

Null

identificator Null Null Null Null vrf

Adr. Adr. vector de legturi ctre descendenii vrfului fiu 4 fiu 5

Adr. fiu 1

Adr. fiu 2

Adr. fiu 3

Null

Null

16

Null

Null

Null

Null

Null

adres fiu 1
13 12 11 10
Null Null Null Null Null Null Null Null Null Null Null

Null

15 14
Null

Null

adres Null Null Null Null fiu n


Null Null Null

Null

Null

Null

Null

Null

Null

Null

Null

Null

Null

Null

Null

Null

Null

Parcurgeri
Aplicarea sistematic a unei reguli de vizitare a

vrfurilor arborelui.
Cele mai utilizate reguli de parcurgere a arborilor orientai snt
A-preordine (variant DF)
A-postordine (variant DF) parcurgerea pe niveluri (BF)

Parcurgerea n A-preordine (Fiu-Frate)


Se viziteaz vrful curent i se identific descendenii lui. Se aplic aceeai regul de vizitare pentru fiecare dintre arborii avnd ca rdcini descendenii vrfului curent.
1

void A_preordine (nod R) { if (R) { vizit (R); A_preordine(FIU[R]); A_preordine(FRATE[R]); } }


9

10

11

12

13

14

15

16

1, 2, 5, 6, 9, 10, 11, 12, 13, 7, 3, 4, 8, 14, 15, 16

Parcurgerea n A-postordine (Fiu-Frate)


Se identific i se viziteaz descendenii vrfului curent, apoi se viziteaz vrful curent. Se aplic aceeai regul de vizitare pentru arborii avnd ca rdcini descendenii vrfului curent.
1

void A_postordine (nod R) { if (R) { A_postordine(FIU[R]); vizit (R); A_postordine(FRATE[R]); }


9

} 5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1

10

11

12

13

14

15

16

Parcurgeri n adncime (str. dinamice)


void A_preordine (nod R) { if (R) { vizit (R); for(i=0;i<n;i++) A_preordine(R->leg[i]); } } void A_postordine (nod R) { if (R) { for(i=0;i<n;i++) A_postordine(R->leg[i]); vizit (R); } }

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

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<n;i++) 5 6 if(R->leg[i]) push(C,R->leg[i]); } 9 10 11

12

13

14

15

16

}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16

Arbori pariali
Definiie. Fie un graf. Subgraful parial este un arbore parial al lui dac este graf arbore. Definiie. Fie = (, , ) un graf ponderat conex. Dac = (, 0) este un arbore parial al grafului = (, ), ponderea arborelui , notat (), este definit prin () =
0

()

Definiie. Arborele parial 0 () este arbore parial minim pentru dac (0) = min*(); ()+, unde () este mulimea arborilor pariali ai grafului .

Arbori pariali
1 1 4 4 3 2 3 3 8 7 3 6 5 4 2 7 3 2 3

P = 22
4

1 1 4

2 3 8 6 5 4 2 7 3

P = 20
4

1 1 4

P = 15

1 1 4

3 3 7 3 6 2

2 3 3 6 7 5 4 2 7

3 2

Algoritmul lui Kruskal


Problem: determinarea arborelui parial de cost minim = , al grafului = (, ). Algoritm: se iniializeaz = iar = .

dintre arcele disponibile (neselectate anterior) se alege


arcul cu ponderea cea mai mic i care nu formeaz un ciclu prin adugare la arbore repet pasul anterior de 1 ori

Algoritmul lui Kruskal


1
4 2 3 8 12

2
2

8 1 4

6
9

4
Nr. arc curent

3
Vectorul Tata

Arc curent

2 1 2 1 3 1 4 5 3 3 3

3 1 6 2 4 2 5 3 4 4 2 4 6 8 6 8 6 9 5 12 4 5

v v v v x v

1
4 2 3

2
2 1

i j
Nr. arce selectate

arc (2,3) (1,6) (2,4) (1,5) (3,4) (1,2)

0 1 2 3 4 5

0 1 2 3 4 4

(-1, (-1, (-2, (-2, (-3, (-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, 1, 1)

cost

total

1 2 2 3 4

0 1 3 5 8 8 12

Algoritmul lui Kruskal


Funcie pentru determinarea rdcinii
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

2,

2,

1,

1)

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<nv; i++) tata[i]=-1; for(i=j=0; j<nv-1; i++) { 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; }

Spor la nvat!

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