300 likes | 723 Views
?. ?. ?. ?. Grafuri de tip arbore. Grafuri de tip arbore. Graful este arbore dacă este aciclic şi conex. Grafuri de tip arbore. Fie un graf arbore. Subgraful al lui este subarbore dacă este de tip arbore. Grafuri de tip arbore.
E N D
? ? ? ? Grafuri de tip arbore
Grafuri de tip arbore • Graful este arboredacă este aciclic şi conex.
Grafuri de tip arbore • Fie un graf arbore. Subgraful al lui este subarbore dacă este de tip arbore.
Grafuri de tip arbore • Fie un graf. Următoarele afirmații sînt echivalente: • G este graf arbore (aciclicşi conex); • G este graf conex minimal • G este graf aciclic maximal • Cum verificăm dacă un graf este arbore? • Verificare conexitate+ verificareaciclicitate (alg. Marimont) • Verificareaciclicitateşi n = m + 1 • Verificareconexitateşi n = m + 1
Grafuri de tip arbore • Fie un digraf • Digraful estegrafasimetric dacă pentru orice , . • Digraful este grafsimetric dacă pentruoriceşi .
Grafuri de tip arbore • Fie un digraf netrivial • Graful unde se numește graf suport al digrafului .
Grafuri de tip arbore • Un arbore direcţionateste un graf orientat asimetricpentru care graful suport corespunzător este graf arbore. • Arborele direcţionat este arbore cu rădăcină dacă există astfel încît, pentru orice , , există drum în . Vîrful se numeşte rădăcina arborelui direcţionat (drumurile sînt unice, rădăcina este unică; lungimea unui drum este egală cu numărul de arce). • Fie arbore direcţionat. Arborele este subarbore al lui dacă , şi este arbore direcţionat. • Un arbore orientat este un arbore direcţionat cu rădăcină. • Fie , un arbore orientat cu rădăcină r. Un vîrf v este situat pe nivelul ial arborelui T, dacă distanţa de la vîrf la rădăcină este egală cu i. • Rădăcina arborelui este considerată de nivel 0.
Reprezentări • Se pot folosi toate tipurile de reprezentare a grafurilor, plus metode specifice arborilor, mai eficiente. • Reprezentarea Fiu-Frate • N: numărul de noduri • R: nodul rădăcină • Fiu(i): eticheta ataşată primului descendent al vîrfului i • Frate(i): eticheta ataşată vîrfului descendent al tatălui vîrfului i şi care urmează imediat lui i • Inf(i): informaţia ataşată vîrfului i • Valoare lipsă: se foloseşte o valoare convenţională (0, -1…)
Reprezentări • Cum se determină descendenții unui nod? • Cum se determină părintele unui nod? • Cum se adaugă un nod în arbore?
Reprezentări • Reprezentarea cu structuri dinamice • Număr limitat de descendenți pentru fiecare nod: • are valoare mică • Pentru fiecare vîrf se alocă dinamic o structură de tipul • Pentru a cunoaște arborele: adresa nodului rădăcină
Parcurgeri • Aplicarea sistematică a unei reguli de vizitare a nodurilor arborelui • Variante adaptate ale parcurgerii grafurilor: • În lățime (BF) • Parcurgere pe niveluri • În adîncime (DF) • Parcurgerea în A-preordine • Parcurgerea în A-postordine
Parcurgeri • Pe niveluri (reprezentare Fiu-Frate) parcurgere_pe_niveluri( R, FIU[], FRATE[], n ) { Coadă C=NULL; adaugă ( C, R ); cît timp ( C ) {extrage( C, v ); Prelucrează( v ); v = FIU[v]; cît timp ( v ) {adaugă( C, v); v = FRATE[v]; } } } 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Parcurgeri • Pe niveluri (reprezentare cu structuri dinamice) parcurgere_pe_niveluri( R ) { Coadă C=NULL; adaugă ( C, R ); cît timp ( C ) {extrage( C, v ); Prelucrează( v ); pentru ( i=0,n-1 ) dacă ( v->fiu[i]) adaugă( C, v->fiu[i]); } } 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
Parcurgeri • A-preordine (reprezentare Fiu-Frate) • Se vizitează nodul curent și se identifică descendenții săi. Se aplică aceeași regulă, pe rînd, pentru fiecare din subarborii care au ca rădăcină unul din descendenții nodului curent. A_preordine ( R ) { dacă ( R ) { Prelucrează ( 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
Parcurgeri • A-postordine (reprezentare Fiu-Frate) • Se identifică descendenții nodului curent și se vizitează, pe rînd, fiecare din subarborii care au ca rădăcină unul din descendenții nodului curent, apoi se vizitează nodul curent. Pentru fiecare subarbore se aplică aceeași regulă. A_postordine ( R ) { dacă ( R ) { A_postordine( FIU[R] ); Prelucrează ( R ); A_postordine( FRATE[R] ); } } 5, 9, 10, 11, 12, 13, 6, 7, 2, 3, 14, 15, 16, 8, 4, 1
Parcurgeri • Parcurgeri în adîncime (reprezentare cu structuri dinamice) A_preordine ( R ) { dacă( R ) { Prelucrează( R ); pentru( i=0,n-1) A_preordine( R->fiu[i] ); } } A_postordine ( R ) { dacă(R) { pentru( i=0,n-1 ) A_postordine( R->fiu[i] ); Prelucrează( R ); } }
Arbori parțiali • Fie un graf. Subgraful parţial este un arbore parţial al lui dacă este graf arbore. • Fie un graf ponderat conex. Dacă este un arbore parţial al grafului , ponderea arborelui , notată , este definită prin • Arborele parţial este arbore parţial minim pentru dacă unde este mulţimea arborilor parţiali corespunzători grafului .
AlgoritmulluiKruskal • Problemă • determinarea arborelui parţial de cost minim al grafului • Algoritm: • se iniţializeazăca mulţime vidă • Repetă de ori • Dintre arcele disponibile (care nu au fost analizate încă) se alege arcul cu ponderea cea mai mică şi care nu formează un ciclu prin adăugare la arbore.
AlgoritmulluiKruskal 6 7 1 2 5 2 2 7 2 4 5 2 1 2 3 1 4 3 3 5 3 3 7 3 3 4 4 4 6 5 5 6 6 i j arc Tata:1 2 3 4 5 6 7 cost total ( -1 -1 -1 -1 -1 -1 -1 ) 0 0 1 (6,7) ( -1 -1 -1 -1 -1 7-2 ) 1 1 1 2 (2,5) ( -1 5-1 -1 -2 7 -2 ) 2 3 2 3(2,7) ( -1 5 -1 -1 7 7 -4) 2 5 3 4 (4,5) ( -1 5 -1 7 7 7 -5) 2 7 4 5 (1,2) ( 7 5 -1 7 7 7 -6) 3 10 5 5 (1,4) ( 7 7 -1 7 7 7 -6 ) 10 6 6 (3,5) ( 7 7 7 7 7 7 -7) 3 13 Nr. arce adăugate Pas curent
Algoritmul lui Kruskal • Funcţie pentru determinarea rădăcinii intradacina( intv, inttata[]) { intu; u = v; while( tata[u] >= 0 ) u = tata[u]; return u; } Ex.: v = 2 u = 2 tata[2]=5 u = 5 tata[5]=7 u = 7tata[7]=-4 < 0 1 2 3 4 5 6 7 ( -1 5 -1 -1 7 7 -4 )
AlgoritmulluiKruskal intkruskal(int a[][3],int nm, intnv, 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; }
Algoritmullui Prim • Problemă • determinarea arborelui parţial de cost minim al grafului • Algoritm: • se iniţializeazăca mulţime vidă • Alege un vîrf inițial oarecare , , • Repetă de ori • Alege muchia cu cea mai mică pondere a.î. și
Algoritmullui Prim • Temă: • Implementați algoritmul Prim • Prim sau Kruskal?