Grafuri neorientate
Definitie:
Se numeste graf neorientat, o pereche ordonata de multimi notata G=(X,U), unde X= este o multime finite si nevida de elemnte numite noduri sau varfuri, iar U= este o multime de perechi neordonate de elemente din X numite muchii.
Asadar un neorientat poate fi reprezentat sub forma unei figure geometrice alcatuite din puncte(noduri,varfuri) si linii drepte sau curbe care unesc aceste puncte (muchii,arce).
Exemplu:
G=(X,U) X= U=
Pentru o muchie
Doua muchii care au o extremitate comuna se numesc incidente.
Definitie:
Gradul unui varf x, notat d(x), reprezinta numarul muchiilor care trec prin nodul x (incidente cu nodul x).
Exemplu: d(1)=3, d(2)=2, d(4)=0, d(5)=1.
Un varf care are gradul 0 se numeste varf izolat(de exemplu varful 4).
Un varf care are gradul 1 se numeste varf terminal(de exemplu varful 5).
Propozitie:
Fie G=(X,U) un graf neorientat cu n noduri si m muchii, suma gradelor tuturor nodurilor este egala cu 2m.
Intr-un graf neorientat numarul nodurilor de grad impar este un numar par.
Se numeste subgraf al grafului G=(X,U) ungraf neorientat H=(Y,V), unde Y X iar V contine toate muchiile din U care au ambele extremitati in multimea Y.
Cele mai cunoscute forme de reprezentare ale unui astfel de graf sunt: matricea de adiacenta, listele vecinilor si vectorul muchiilor.
Este o matrice patratica cu n linii si n coloane, in care elementele a[i,j] se definesc astfel: a[i,j]=1 daca exista (i,j) in U, cu x diferit de y si 0 daca nu exista (i,j) in U.
Pentru graful G=(X,U) din figura de mai jos, matricea de adiacenta este:
linia
0 1 1 1 1
1 0 1 0 2
A= 1 1 0 1 3
1 0 1 0 4
coloana 1 2 3 4
a[i,j]=a[j,i] oricare ar fi i,j I
Proprietatile matricei de adiacenta:
Este o matrice simetrica;
Pe diagonala principala are toate elemntele egale cu 0;
Suma elementelor pe linia sau coloana i este egala cu gradul nodului i;
Daca elementele pe linia/coloana i sunt toate egale cu 0 atunci nodul este izolat;
Daca toate elementele din matrice,mai putin cele de pe diagonala principala, sunt 1 inseamna ca graful este complet.
Pentru fiecare nod al grafului se retin nodurile adiacente cu el.
Pentru reprezentarea listei de adiacenta se poate folosi alocare dinamica.
Exemplu pentru matricea de adiacenta de mai sus:
nodul lista vecinilor
2, 3, 4
1, 3
1, 2, 4
1, 3
Fiecare muchie a grafului poate fi privita ca o inregistrare cu doua componente: cele doua varfuri care constitue extremitatile muchiei. Notand aceste extremitati cu nod1 si nod2, putem defini tipul de date tmuchie, astfel:
type tmuchie=record
nod1,nod2:integer;
end;
Graful in ansamblul sau, este o multime de muchii, adica o multime de elemente de tipul tmuchie.In consecinta definim graful ca un "vector de muchii", adica un vector cu elementele de tipul tmuchie:
var v:array[1..25] of tmuchie;
Graf complet si graf bipartit.
Se numeste graf complet cu n varfuri, notat Kn, un graf G=(X,U) cu proprietatea ca intre oricare doua varfuri exista o muchie.
Exemplu:
Un graf complet cu n varfuri are n*(n-1)/2 muchii.
Un graf neorientat G=(X,U) se numeste bipartit daca exista 2 multimi de noduri A si B X astfel incat A B=X si A B= ; iar orice muchie din U are o extremitate in multimea A si una in multimea B.
Exemplu: Fie G=(X,U) unde X=, U=
Cu multimile A= si B=
Se obesrva ca: A B=X, A B= , iar fiecare muchie
are o extremitate in A si una in B.
Se numeste graf
bibartit complet, un graf bipartit cu proprietatea ca pentru orice varf x
din A si orice varf y din B, exista muchia(x,y) (unde A si B sunt cele doua
submultimi care partitioneaza multimea varfurilorX).
Exemplu:
Notiunile de lant si ciclu
Se numeste lant in graful G, o succesiune de varfuri L=(x1,x2,...,xp) ,cu xi IX, in care ( ) 2 noduri consecutive din succesiune sunt adiacente, adica exista muchiile (x1,x2),(x2,x3),..,(xp-1,xp)IU.
Varfurile x1 si xp se numesc extremitatile lantului, iar numarul de muchii care intra in componenta sa reprezinta lungimea lantului.
Un lant in care ( ) 2 elemente sunt diferite se numeste lant elementar. Altfel lantul este neelementar.
Exemplu:
Lant elementar:1,2,3,4,5; 6,7,3,9,4,8.
Lant neelementar: 1,2,3,2;
Un graf G este conex, daca oricare ar fi doua varfuri ale sale , exista un lant care le leaga.
Se numeste ciclu intr-un graf, un lant in care extremitatile coincid si muchiile sunt diferite intre ele.
Exemplu: c1=(3,4,5,3,7,6,1,2,3), c2=(1,2,3,7,6,1), c3=(3,5,4,9,3)
Daca intr-un ciclu, toate varfurile cu exceptia primului si a ultimului sunt distincte doua cate doua, atunci ciclul se numeste elementar. In caz contrar el este neelementar.
Ciclurile c2 si c3 din exemplul anterior sunt elementare,iar c1 este neelementar(in c1, varful 3 apare si ca varf "intermediar",adica traseul descris mai trece odata prin varful 3 pe langa faptul ca porneste din el si se intoarce tot in el.).
Parcurgerea grafurilor neorientate
Prin parcurgerea grafurilor neorientate se intelege vizitarea varfurilor intr-o anumita ordine, ordine data de un anumit criteriu.
Exista doua metode de parcurgere:
Parcurgerea in latime BF(Breadth First);
Parcurgerea in adancime DF(Depth First);
Algoritmul de parcurgere in latime BF
Fiind dat un graf neorientat G=(X,U) si un nod xIX, sa se parcurga toate varfurile grafului incepand din varful x.
Metoda consta in:
-se viziteaza varful de pornire, dupa care se viziteaza toate varfurile adiacente cu acesta care nu au fost vizitate inca,in continuare se alege primul varf adiacent cu varful de pornire si se viziteaza toate varfurile adiacente cu acesta nevizitate inca si asa mai departe pentru celelalte varfuri cat timp este posibil.Exemplu:
Presupunem ca varful de pornire este 1,atunci parcurgerea BF este:1,2,5,6,3,4,7.
Pentu 3 varf de pornire:3,2,4,1,5,6,7.
Pentru implementare vom folosi un vector care are proprietatile unei cozi, fie c=(c1,c2,.,ck). Capetele de intoducere si extragere vor fi identificate prin pozitiile p si respectiv u.
Notam cu n numarul de noduri din graf. Este necesar ca elemntele matricei de adiacenta a cu n linii*n coloane sa fie cunoscute.
Mai avem nevoie de un vector viz cu n elemente, in care elementele viz[k] (k=1,2,..,n) au semnificatia: viz[i]=0, daca varful i nu a fost vizitat sau viz[i]=0 daca a fost vizitat. Mai intai initializam tot vectorul viz cu 0.
Initial in coada se gaseste varful de pornire: p=1, u=1, c[p]:=x, viz[x]:=1.
Cat timp mai sunt elemente in coada("while p<=u"):
Extragem din coada varful aflat in capatul de extragere u, si-l memoram intr-o variabila z
Pe linia z in a cautam vecinii lui z si ii introducem in coada.
Algoritmul de parcurgere in adancime DF
Metoda consta in:
-alegem varful de pornire, pentru acesta se alege primul vecin al sau nevizitat inca,pentru acest vecin cautam primul vecin al sau nevizitat si asa in continuare. In cazul in care un varf nu mai are vecini nevizitati atunci ne intoarcem la nodul anterior, iar pentru acel nod cautam urmatorul vecin nevizitat al sau.
Pentru graful de mai sus parcurgerea in adancime plecand de la varful 1 este: 1,2,3,4,6,7,5.
Pentru a implementa vom folosi o stiva si metoda backtracking.
Conexitatea in grafurile neorientate
Prin parcurgerea in latime acelui graf am subliniat o proprietate importanta a grafului:faptul ca in urma parcurgerii au fost vizitate toate varfurile.
Luand oricare doua varfuri,putem gasi cel putin un traseu care porneste dintr-un varf si ajunge in celalalt.
Luand oricare doua varfuri, ele pot fi legate printr-un lant.
Dar nu toate grafurile sunt conexe. In schimb putem desprinde din el "portiuni" care, fiecare luata separat, este un graf conex.
Exemplu:
Se numeste componenta conexa a grafului G=(X,U), un subgraf G1=(X1,U1) a lui G, conex, cu proprietatea ca nu exista nici un lant care sa lege un varf din X1 cu un varf din X-X1.
Grafuri hamiltoniene si euleriene.
Se numeste ciclu hamiltonian intr-un graf, un ciclu elementar care contine toate varfurile grafului.
Un graf care contine un ciclu hamiltonian se numeste graf hamiltonian.
Un lant elementar care contine toate varfurile grafului se numeste lant hamiltonian.
Un graf hamiltonian are cel putin trei varfuri.
Graful complet cu n varfuri este un graf hamiltonian.
Teorema:
Fie G=(X,U), cu n>=3 varfuri, daca oricare ar fi x un nod al grafului si d(x)>=n/2, atunci graful este hamiltonian.
Se numeste ciclu eulerian intr-un graf, un ciclu care contine toate muchiile grafului.
Un graf care contine un ciclu eulerian se numeste graf eulerian.
Un lant eulerian este un lant care contine toate muchiile grafului.
Teorema:
Un graf fara varfuri izolate este eulerian, daca si numai daca este conex si gradele tuturor varfurilor sunt numere pare.