joi, 14 iunie 2012

Grafuri




GRAFURI NEORIENTATE



Definiţie  Se numeşte graf neorientat o pereche ordonată de mulţimi (V,U), V fiind o mulţime finită şi nevidă de elemente numite noduri sau vâfuri, iar U o mulţime de perechi neordonate (submulţimi de două elemente) din V numite muchii.


Definiţie Numim muchii adiacente două muchii cu o extremitate comună. Pentru exemplul de mai sus, muchiile [1,5] şi [5,4] sunt muchii adiacente pentru că au ca extremitate comună nodul 5.
Definiţie Un graf parţial al grafului G=(V,U) este un graf G1=(V,U1) astfel încât U1este inclus in U, adică G1 are aceeaşi mulţime de vârfuri ca G, iar muţimea de muchii U1 este chiar U sau o submulţime a acesteia (un graf parţial al unui graf se obţine păstrând aceeaşi mulţime de noduri şi eliminând o parte din muchii).

Definiţie Un subgraf al unui graf G=(V,U) este un graf H(V1,U1) astfel încât V1 este inclus in V iar U1 conţine toate muchiile din U care au ambele extremităţi în V1 (un subgraf se obţine eliminând vârfuri din V şi muchiile incidente acestor vârfuri). Vom spune că subgraful H este indus sau generat de mulţimea de vârfuri V1.

Definiţie Gradul unui vârf x este numărul muchiile incidente cu x. Gradul vârfului x se notează d(x).
Definiţie Un vârf care are gradul 0 se numeşte vârf izolat.
Definiţie Un vârf care are gradul 1 se numeşte vârf terminal.
Propoziţie Dacă un graf G(V,U) are m muchii şi n vârfuri, iar V={x1,x2,...,xn} atunci d(x1)+d(x2)+...+d(xn)=2*m.
Corolar În orice graf G există un număr par de vârfuri cu grad impar.
Definiţie Se numeşte graf complet cu n vârfuri un graf care are proprietatea că orice două noduri diferite sunt adiacente.
Propoziţie Un graf complet Kn are n(n-1)/2 muchii.
Definiţie Un graf G=(V,U) se numeşte bipartit dacă există două mulţimi nevide A, B astfel încât V=A U B, A∩B = şi orice muchie a lui G are o extremitate în A iar cealaltă în B.

Definiţie Un graf bipartit se numeşte complet dacă pentru orice x din A şi y din B, există muchia (x,y).

Fie G=(V,U) un graf neorientat, V={x1,x2,..,xn}.
Definiţie Se numeşte lanţ în G succesiunea de vârfuri L=[xi1,xi2,...,xik] cu proprietate că orice două noduri consecutive din lant sunt adiacente, adică [xi1,xi2], [xi2,xi3], ..., [xik-1,xik]
Definiţie  Dacă vârfurile xi1, xi2, ..., xik sunt diferite două câte două atunci lanţul se numeşte lanţ elementar. În caz contrar, lanţul este lanţ neelemntar. Cu alte cuvinte, un lanţ elementar este un lanţ care nu trece de două ori prin acelaşi vârf.

Definiţie Se numeşte ciclu în G un lanţ L pentru care xi1=xik şi toate muchiile adiacente [xi1, xi2], [xi2, xi3], ..., [xik-1, xik] sunt diferite.
Definiţie Se numeşte ciclu elementar un ciclu care are proprietate că oricare două vârfuri ale sale, cu excepţia primului şi ultimului, sunt diferite două câte două. În caz contrar, ciclul este un ciclu neelementar.
Pentru exemplul anterior un ciclu elementar este [3,5,6,3].
Definiţie Un graf G se numeşte conex dacă pentru orice două vârfuri x şi y diferite ale sale există un lanţ ce le leagă.
Definiţie Se numeşte componentă conexă a grafului G=(V,U) un subgraf G1=(V1,U1), conex, al lui G care are proprietatea că nu există nici un lanţ care să lege un vârf din V1 cu un vârf din V-V1. Cu alte cuvinte, se numeste componenta conexa a unui graf neorientat, G = (V,U), un subgraf al lui G, G1=(V1,U1), conex si maximal.

În exemplul din anterioara avem două componente conexe : 1 : [2]         2 : [1,3,4,5,6]
Definiţie Numarul Mu(G) = m-n+p se numeste numar ciclomatic al grafului G=(V,U); am notat cu m=numarul de elemente din U, n=numarul de elemente din V , p - numarul componentelor conexe ale grafului.
Definiţie Numarul Lm(G) = n-p se numeste numar cociclomatic





GRAFURI ORIENTATE











Definitie Se numește graf orientat notat cu G o pereche ordonată de mulțimi {X,U} G= {X,U} unde X este mulțimea vârfurilor si U este multimea arcelor.
X={1,2,3,4,5}
U={(1,2);(1,3);(2,5);(4,2);(4,5)}

MATRICEA DE ADIACENTA.

Matricea de adiacenta asociata unui graf orientat este patratica si nesimetrica:
a[i][j]= 1 daca nodul i este adiacent cu nodul j;
0 daca nodul i nu este adiacent cu nodul j.
pentru graful orientat de mai sus avem urmatoarea matrice de adiacenta:
A= 0 1 1 0 0
0 0 0 0 1
0 0 0 0 0
0 1 0 0 1
0 0 0 0 0

GRAFUL UNUI NOD.
-grad extern este egal cu numarul arcelor care au extremitate initiala( numarul arcelor care ies din X)
-grad intern este egal cu numarul arcelor care au extremitate finala( numarul arcelor care intra in X).
TERMINOLOGIE.
Elementele mutimii U se numesc arce,iar multimea U se mai numeste si multimea arcelor.
Varfurile adiacente sunt orice pereche de varfuri care formeaza un arc.
Pentru arcul (x,y) spunem ca x este extremitate initiala iar y este extremitate finala.
Se numesc arce incidente doua arce care au o extremitate comuna.
Se numeste succesor al varfului X orice varf in care ajunge un arc care pleaca din varful X.
Se numeste predecesor al varfului X orice varf in care intra un arc care pleaca din varful X.
Nod sursa al grafului este nodul care are multimea succesorilor formata din toate celelalte noduri mai putin el iar multimea predecesorilo sai este vida. Nod destinatie al grafului este nodul care are multimea predecesorilor formata din toate celelalte noduri mai putin el iar multimea succesorilor sai este vida.
Se numeste nod terminal un nod care are suma gradelor egala cu 1.
Se numeste nod izolat un nod care are suma gradelor egala cu 0.
TEOREME.
1.Numarul total de grafuri orientate care se pot forma cu n noduri este
2.Intr-un graf orientat cu n varfuri suma gradelor interne ale tuturor nodurilor este egala cu suma gradelor exterioare ale tuturor nodurilor si cu numarul de arce.
3.Numarul de grafuri orientate complete care se pot construi cu n noduri este egal cu
4.Un graf cu mai mult de 2 noduri este hamiltonian daca gradul fiecarui nod este >=n/2.
5. Un graf ce nu contine grafuri izolate este eulerian daca si numai daca este conex si gradele tuturor nodurilor sunt pare.
6. Numarul de cicluri hamiltoniene dintr-un graf complet cu n noduri este
7. Orice graf turneu contine un drum elementar care trece prin toate nodurile grafului.
8. Pentru orice graf turneu, exista un nod x, astfel incat toate nodurile y!=x sunt accesibile din x pe un drum care contine un arc sau doua arce.
GRAFURI SPECIALE.
Graful G se numeste graf bipartit daca exista 2 multimi nevide de noduri A si B care au urmatoarele proprietati: AuB=X si AnB= multimea vida si orice muchie(arc) din multimea U are o extremitate in multimea de noduri A si o alta extremitate in multimea de noduri B.
Graful bipartit se numeste graf bipartit complet daca pentru orice nod xi care apartine lui A si orice nod xj care apartine lui B exista o muchie ( un arc ) formata din cele 2 noduri care apatin multumii U( [ xi, xj ]e U).
Graful GT1 este graf bipartit.
A={1,3,5}
B={2,4,6,7}
GT1

Graful GT2 este bipartit complet.
A={ 1,2}
B={3,6,7}

GT2
Numim lant hamiltonian un lant elementar ce contine toate nodurile grafului.
Lantul elementar este lantul care contine numai noduri distincte.
Numim ciclu hamiltonian un ciclu elementar ce contine toate nodurile grafului.
Un graf ce contine un ciclu hamiltonian se numeste graf hamiltonian.
Numim ciclu eulerian un ciclu ce contine toate muchiile grafului.
Un graf ce contine un ciclu eulerian se numeste graf eulerian.
Un garf orientat in care , intre oricare 2 noduri exista un singur arc si numai unul se numeste graf turneu.



Parcurgerea in latime

// inițializări
pentru fiecare nod u din V
{
    culoare[u] = alb
    d[u] = infinit
    p[u] = null
}
culoare[sursa] = gri
d[sursa] = 0
enqueue(Q,sursa) // punem nodul sursă în coada Q
 
// algoritmul propriu-zis
cât timp coada Q nu este vidă
{
    v = dequeue(Q) // extragem nodul v din coadă
    pentru fiecare u dintre vecinii lui v
        dacă culoare[u] == alb
        {
            culoare[u] = gri
            p[u] = v
            d[u] = d[v] +1
            enqueue(Q,u) // adăugăm nodul u în coadă
        }
    culoare[v] = negru // am terminat de explorat toți vecinii lui v
}




Parcurgerea in adancime 

//inițializări
pentru fiecare nod u din V
{
    culoare[u] = alb
    p[u] = NULL
    tDesc[u] = 0
    tFin[u] = 0
}
contor_timp = 0
 
//aplicarea algoritmului pentru toate componentele conexe 
pentru fiecare nod u din V
{
    daca culoare[u] == alb
        DFS(u)
}
 
//algoritmul propriu-zis
DFS(u)
{
    vizitare(u) // efectuarea de operațiuni asupra nodului curent
    contor_timp = contor_timp + 1
    tDesc[u] = contor_timp
    culoare[u] = gri
 
    pentru toate nodurile v adiacente lui u
        daca culoare[v] == alb
        {
            p[v] = u
            DFS(v)
        }
 
    contor_timp = contor_timp + 1
    tFin[u] = contor_timp
    culoare[u] = negru
}

miercuri, 13 iunie 2012

Arbori - generalitati

Definitie generala
  1. Un arbore este un graf conex aciclic.
  2. Arborele este o multime de noduri cu proprietatile ca exista un nod numit radacina si celelalte noduri se impart in submultimi disjuncte numite subarbori.




Reprezentarea arborilor

     Arbori oarecare:
          -matricea de adiacenta;
          -liste de adiacenta;
          -vectorul TATA;

     Arbori binari:
          -matricea de adiacenta;
          -liste de adiacenta;
          -vectorul TATA;
          -vectorii ST si DR;
          -reprezentare dinaminca;

     Alocarea statica reprezinta rezervarea memoriei fara posibilitatea de extindere sau eliberare a zonei de memorie alocataca.
     Alocarea dinamica presupune rezervarea si eliberarea memoriei alocate in timpul executiei programului.


     Arborele complet este un arbore echilibrat ce prezinta 2 fii nenuli ai oricarui nod terminal.
     Arborele plin are toate frunzele(nodurile terminale) pe acelasi nivel si orice nod neterminal are 2 fii.

miercuri, 6 iunie 2012

Arbori Binari

Definitie


     Un arbore binar este o multime de n >= 0 noduri, care daca nu este vida, contine un nod numit radacina, restul nodurilor formand doi arbori disjuncti numiti subarborele stang si subarborele drept.
     Aceasta structura de date e importanta pentru ca e usor de reprezentat si prelucrat, orice arbore putand fi transformat în arbore binar.




Tehnica transformarii unui arbore generalizat in arbore binar


     Un arbore generalizat poate fi transformat intr-un arbore binar, astfel incat secventele de noduri pentru parcurgerea in preordine sa fie identice in cazul ambilor arbori.
     Un arbore generalizat A cu radacina A1 si subarborii A1,1, A1,2, ...,A1,k se transforma in arbore binar avand radacina A1, A1,1 fiul sau stang, iar A1,i devin fii drepti ai lui A1,i-1 pentru 2<=i<=k.
     Secventele de noduri in parcurgerea in preordine a arborelui generalizat si a celui binar obtinut prin transformare, sunt identice.




Implementarea arborilor binari


     Un arbore binar poate fi creat cu ajutorul urmatoarei structuri:
 struct nod
  {
      int info;
      nod*st;
      nod*dr;
  };




Operatorii arborelui binar


 INITIALIZEAZA(A) - face vid arborele A;
 INSEREAZA(X,A) - insereaza cheia X în arborele A;
 CAUTA(X,A) - cauta cheia X, returnând true la gasire;
 SUPRIMA(X,A) - suprima cheia X, daca exista;
 TRAVERSEAZA(A) - parcurge toate cheile arborelui A




Traversarea arborilor binari


     Pentru un arbore binar, notand cu Rad radacina si cu St si cu Dr subarborele sau stang, respectiv drept, cele 3 posibilitati de traversare sunt:
 -preordine - lista Rad, St, Dr
 -inordine - lista St, Rad, Dr
 -postordine- lista St, Dr, Rad


Cele trei metode de traversare se concretizeaza in trei functii recursive.




Arbori binari ordonati. Arbori binari de înaltime minima


     Arborele binar ordonat e arborele binar cu proprietatea ca parcurgand nodurile in inordine, secventa cheilor este monoton crescatoare.
     Are proprietatea ca daca un nod oarecare al arborelui are cheia C, toate nodurile din subarborele stang al nodului au cheile mai mici decat valoarea C, respectiv toate cheile din subarborele drept au cheile mai mari sau egale cu C. De aici rezulta procedeul de cautare foarte simplu, prin trecerea la fiul stang sau drept de la nodul curent, in functie de relatia dintre cheia cautata si cea a nodului curent. 
     Cum inaltimea minima a unui arbore binar ordonat cu n noduri este hmin=[log2 (n+1)], rezulta ca o cautare intr-un arbore binar ordonat necesita aproximativ log2n comparatii de chei, fata de n/2 comparatii intr-o lista liniara.




Tehnica de creare a arborilor binari ordonati


     Procesul de creare consta in insertia cate unui nod intr-un arbore binar ordonat, care initial este vid, astfel incat dupa insertie el sa ramana ordonat. 
     Pentru aceasta se traverseaza arborele incepand cu radacina si se selecteaza fiul stang sau drept, dupa cum cheia de inserat e mai mica sau mai mare decat a nodului parcurs. Se repeta pana cand se ajunge la un pointer NULL care se inlocuieste cu pointerul spre noul nod creat.  Pentru ca sortarea sa fie stabila, se trece la fiul drept chiar daca valoarea cheii e egala.