270 likes | 688 Vues
Structuri arborescente. Definitie. Graful G este arbore daca G este aciclic si conex.. . . . . . . Structuri arborescente. Definitie. Fie G=(V,E) graf arbore. Subgraful H=(V1,E1) al lui G este subarbore al lui G daca H este graf arbore.. . . . . Structuri arborescente. Fie G=(V,E) un graf.
E N D
1. Structuri arborescente (grafuri de tip arbore)
2. Structuri arborescente Definitie. Graful G este arbore daca G este aciclic si conex.
3. Structuri arborescente Definitie. Fie G=(V,E) graf arbore. Subgraful H=(V1,E1) al lui G este subarbore al lui G daca H este graf arbore.
4. Structuri arborescente Fie G=(V,E) un graf. Urmatoarele afirmatii snt echivalente:
G este graf arbore (aciclic si conex);
G este graf conex minimal: oricare ar fi e?E, prin eliminarea muchiei e din E, graful rezultat nu este conex;
G este graf aciclic maximal: prin adaugarea unei noi muchii n graf rezulta cel putin un ciclu.
Cum verificam daca un graf este arbore?
Verificare conexitate + verificare aciclicitate (alg. Marimont)
Verificare aciclicitate si n = m + 1
Verificare conexitate si n = m + 1
5. Structuri arborescente Definitie. Se numeste graf asimetric un digraf D=(V,E) cu proprietatea ca pentru orice uv?E, vu nu apartine E. Digraful D este simetric daca pentru orice uv?E si vu?E.
6. Structuri arborescente Definitie. Fie D=( V, E ) digraf netrivial. Graful G=( V, E ), unde E = { uv / uv?E sau vu?E} se numeste graf suport al digrafului D.
7. Structuri arborescente Definitie. Un arbore directionat este un graf orientat asimetric pentru care graful suport corespunzator este graf arbore.
Definitie. Arborele directionat T = ( V, E ) este arbore cu radacina daca exista r ?V astfel nct, pentru orice u ? V, u ? r, exista r-u drum n T. Vrful r se numeste radacina arborelui directionat T (drumurile snt unice, radacina este unica; lungimea unui drum este egala cu numarul de arce).
Definitie. Fie T = ( V, E ) arbore directionat. Arborele T1 = (V1 ,E1 ) este subarbore al lui T daca V1 ? V, E1 ? E si T1 este arbore directionat.
8. Structuri arborescente
9. Reprezentari si parcurgeri (arbori orientati) Definitie. Un arbore orientat este un arbore directionat cu radacina.
Definitie. Fie T=(V,E), un arbore orientat cu radacina r. Un vrf v este situat pe nivelul i al arborelui T, daca distanta de la vrf la radacina este egala cu i. Radacina arborelui este considerata de nivel 0.
Se pot folosi toate tipurile de reprezentare a grafurilor, plus metode specifice arborilor, mai eficiente.
10. Reprezentarea Fiu-Frate N: numarul de noduri
R: nodul radacina
FIU(i): numarul atasat primului descendent al vrfului i
FRATE(i): numarul atasat vrfului descendent al tatalui vrfului i si care urmeaza imediat lui i
INF(i): informatia atasata vrfului i
de obicei informatia e chiar valoarea i, caz n care vectorul nu mai e necesar
Valoare lipsa: se foloseste o valoare conventionala (0, -1)
11. Reprezentarea Fiu-Frate
12. Reprezentare folosind structuri dinamice Presupunnd ca fiecare vrf al arborelui are cel mult n descendenti, fiecarui vrf i este atasata structura
13. Parcurgeri Aplicarea sistematica a unei reguli de vizitare a vrfurilor arborelui.
Cele mai utilizate reguli de parcurgere a arborilor orientati snt
A-preordine (varianta DF)
A-postordine (varianta DF)
parcurgerea pe niveluri (BF)
14. Parcurgerea n A-preordine (Fiu-Frate) Este vizitat vrful curent si snt identificati descendentii lui. Se aplica aceeasi regula de vizitare pentru fiecare dintre arborii avnd ca radacini descendentii vrfului curent
void A_preordine (nod R)
{ if (R){
vizit (R);
A_preordine(FIU[R]);
A_preordine(FRATE[R]);
}
}
1, 2, 5, 6, 9, 10, 11, 12, 13, 7, 3, 4, 8, 14, 15, 16
15. Parcurgerea n A-postordine (Fiu-Frate) Se identifica si se viziteaza descendentii vrfului curent, apoi se viziteaza vrful curent. Se aplica aceeasi regula de vizitare pentru arborii avnd ca radacini descendentii vrfului curent
void A_postordine (nod R)
{ if (R){
A_postordine(FIU[R]);
vizit (R);
A_postordine(FRATE[R]);
}
}
5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1
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);
}
}
17. Parcurgerea pe niveluri (Fiu-Frate) void parcurgere_pe_niveluri(nod R, int FIU[],
int FRATE[], int n)
{ TNOD* C = NULL;
push(C,R);
while (C)
{ pop(C,v);
VIZIT(v);
v=FIU[v];
while (v)
{ push(C,v);
v=FRATE[v];
}
}
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
18. Parcurgerea pe niveluri (str. dinamice) void parcurgere_pe_niveluri(nod *R)
{ TNOD* C = NULL;
push(C,R);
while (C)
{ pop(C,v);
VIZIT(v);
for(i=0;i<n;i++)
if(R->leg[i])
push(C,R->leg[i]);
}
}
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
19. Arbori partiali Definitie. Fie G un graf. Subgraful partial H este un arbore partial al lui G daca H este graf arbore.
Definitie. Fie G=(V,E,w) un graf ponderat conex. Daca T=(V,E0) este un arbore partial al grafului G=(V,E), ponderea arborelui T, notata W(T), este definita prin
W(T)=
Definitie. Arborele partial T0?T(G) este arbore partial minim pentru G daca W(T0) = min { W(T); T?T(G) }, unde T(G) este multimea arborilor partiali corespunzatori grafului G.
20. Arbori partiali
21. Algoritmul lui Kruskal Problema: determinarea arborelui partial de cost minim
Algoritm:
E se initializeaza arborele ca multime vida
Dintre arcele disponibile (neselectate anterior) se alege arcul cu ponderea cea mai mica si care nu formeaza un ciclu prin adaugare la arbore
Repeta pasul anterior de n 1 ori
22. Algoritmul lui Kruskal
23. Functie pentru determinarea radacinii
int radacina(int v,int tata[])
{ int u = v;
while(tata[u] >= 0)
u = tata[u];
return u;
}
Ex.: v = 4
u = 4 tata[4]=2
u = 2 tata[2]=1
u = 1 tata[1]=-6 < 0
Algoritmul lui Kruskal
24. 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;
}
25. Spor la nvatat!