Cls a XI-a I
GRAFURI NEORIENTATE
GRAFURI ORIENTATE
GRAFURI NEORIENTATE
Definitie
Gradul unui vârf.
Graf parţial şi subgraf
Reprezentarea grafurilor neorientate
Parcurgerea grafurilor neorientate
Conexitate in grafuri neorientate
Grafuri hamiltoniene si euleriene
back
Definitie
Definitie:
Se numeste graf neorientat, o
pereche ordonata de multimi
notata G=(X,U), unde
X={x1,x2,…,xn} este o multime
finite si nevida de elemnte numite
noduri sau varfuri, iar
U={u1,u2,…,un} este o multime de
perechi neordonate de elemente
din X numite muchii.
Exemplu:
G=(X,U) X={1,2,3,4,5,6,7,8,9,10}
U={(1,2);(1,3);(1,5);(2,3);(6,7);(6,10
);(7,8);(8,9);(9,10)}
Gradul unui vârf.
Gradul unui varf x, notat d(x), reprezinta numarul muchiilor care
trec prin nodul x (incidente cu nodul x).
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
back
Graf parţial şi subgraf
back
Reprezentarea grafurilor
neorientate
Cele mai cunoscute forme de reprezentare ale unui astfel de graf sunt:
matricea de adiacenta, listele vecinilor si vectorul muchiilor.
Matricea de adiacenta
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:
a[i,j]=a[j,i] oricare ar fi i,j {1,2,…..,n}
linia
Proprietatile matricei de adiacenta: 0 1 1 1 1
Este o matrice simetrica; 1 0 1 0 2
A= 1 1 0 1 3
Pe diagonala principala are toate elementele egale cu 0;
1 0 1 0 4
Suma elementelor pe linia sau coloana i este egala cu gradul nodului i;coloana 1 2 3 4
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.
next
back
Listele vecinilor
Listele vecinilor
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:
4 1, 3
back next
Vectorul
muchiilor.
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;
back
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 BX astfel incat AB=X si
AB=; iar orice muchie din U are o extremitate in
multimea A si una in multimea B.
Exemplu: Fie G=(X,U) unde X={1,2,3,4,5,6,7},
U={(1;5),(2;6),(3;6),(4;7)}
Cu multimile A={1,2,3,4} si B={5,6,7}
Se obesrva ca: AB=X, AB=, 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:
back
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 xX, 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{z:=c[p]};
Pe linia z in a cautam vecinii lui z si ii introducem in coada.
next
back
Parcurgerea grafurilor
neorientate
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.
back
Conexitate in grafuri
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.
back
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.
back
GRAFURI ORIENTATE
Definitie
Graful unui vârf. Mulţimile Γ şi ω
Graf parţial şi subgraf
Reprezentarea grafurilor orientate
Drumuri si circuite in grafuri orientate
Aplicatii grafuri orientate
back
Definitie
back next
Exemplu graf orientat
back
Graf parţial şi subgraf
back
Reprezentarea grafurilor
orientate
Cele mai cunoscute forme de reprezentare
sunt:
matricea de adiacenţă
matricea vârfuri – arce
matricea drumurilor
listele vecinilor.
reprezentarea grafului ca un vector de muchii
back
Matricea de adiacenţă
Are aceeaşi semnificaţie ca în cazul grafurilor neorientate: fiecare element a[i,j], cu i,j ε {1,2,...,n},
este: 1 dacă există arcul (i,j), respectiv 0 în caz contrar.
Datorită orientării, aşa cum am mai spus, arcul (i,j) nu este totuna cu arcul (j,i). Prin urmare, a[i,j] ≠
a[j,i]. Aşadar matricea de adiacenţă nu mai este simetrică faţă de diagonala principală, aşa cum se
întâmpla în cazul grafurilor neorientate.
0 0 0 0 1
1 0 1 1 2
1 A=
4 0 0 0 1 3
0 1 0 0 4
Figura 5
back
Matricea vârfuri – arce
Pentru graful de mai2 jos cu n=4 noduri şi m=5 arce, matricea vârfuri – arce este:
1 0 0 0 0
u1 u3
u2 -1 -1 -1 0 0
1
u4
0 1 0 1 -1
3 4
0 0 1 -1 1
u5
Figura 6
Observaţii:
Pe fiecare coloană j (aferentă arcului uj), avem exact două elemente nenule: un 1 (linia i pe care
se află reprezintă extremitatea iniţială a arcului uj) şi un -1 (linia i pe care se află reprezintă
extremitatea finală a arcului uj)
Numărul valorilor de 1 de pe linia i, reprezintă gradul exterior al nodului i (numărul arcelor ce au ca
extremitate iniţială pe i), iar numărul valorilor de -1 de pe linia i reprezintă gradul interior al nodului i
(numărul arcelor care au ca extremitate finală pe i). back
Listele vecinilor
2
u1 u3
u2
Pentru fiecare nod x se 1
u4
construiesc două liste ale 3 4
vecinilor săi: u5
4 2,3 3
back
Drumuri si circuite in grafuri
orientate
Se numeşte lanţ intr-un graf orientat, o mulţime de arce L={u1,u2,...,uk}, cu
proprietatea ca oricare doua arce vecine in mulţime au o extremitate
comuna.
Un lanţ este de fapt un traseu care uneşte prin arce doua noduri numite
extremităţile lanţului, fără a tine cont de orientarea arcelor componente.
Se numeşte drum în graful G, un şir de noduri D={z1, z2, z3, …, zk}, unde z1,
z2, z3, …, zk aparţin lui x, cu proprietatea că oricare două noduri consecutive
sunt adiacente, adică există arcele [z1, z2], [z2, z3], …, [zk-1,zk] aparţin lui U.
Dacă nodurile z1, z2, z3, …, zk sunt distincte două câte două, drumul se
numeşte elementar. În caz contrar, drumul este ne-elementar.
Se numeşte circuit într-un graf, un lanţ L={z1, z2, z3, …, zk} cu proprietatea
că z1=zk şi arcele [z1, z2], [z2, z3], …, [zk-1,zk] sunt distincte două câte două.
Dacă într-un circuit, toate nodurile cu excepţia primului şi ultimului sunt
distincte două câte două, atunci circuitul se numeşte elementar. În caz
contrar, el este ne-elementar.
back
Matricea drumurilor.
Este o matrice d cu n linii şi n coloane, în care fiecare element d[i,j] este :
-1, dacă există drum de la nodul i la nodul j în graf;
-0, în caz contrar.
Algoritmul Roy-Warshall de determinare a matricei drumurilor
Matricea drumurilor se obţine aplicând matricei de adiacenţă transformări succesive. Vom
spune că există drum de la nodul i la nodul j, dacă găsim un nod k (diferit de i, j) cu
proprietatea că există drum de la i la k şi drum de la j la k. Astfel:
un element a[i, j] care este 0, devine 1, dacă există un nod k astfel încât a[i, k]=1 şi a[k, j]=1.
Pentru a găsi arcele nodului k, trebuie parcurse pe rând în varianta k toate nodurile 1, 2, …,
n.
for k:=1 to n do
for i:=to n do {i≠k}
for j:=1 to n do {j≠k}
if (a[i, j]=0) and (i<>k) and (j<>k) then
a[i, j]:=a[i,k]*a[k, j];
Atribuirea a[i, j]:=a[i,k]*a[k, j] este o scriere elegantă a regulii de mai sus:
în cazul în care unul din elementele a[i,k], a[k, j] este 0, a[i, j] va rămâne 0;
dacă a[i, k]=1 şi a [k, j]=1, atunci a[i, j] devine 1.
back next
Algoritmul Roy-Warshall de determinare a
matricei drumurilor
a[4,3]:=a[4,1]*a[1,3]=1 0 1 1 0
a[3,2]:=a[3,1]*a[1,2]=0
0 0 1 1
A
a[3,4]:=a[3,1]*a[1,4]=0 0 0 0 0
a[4,4]:=a[4,1]*a[1,4]=0
1 0
1 1
back
next
Pentru k=2
Se parcurg elementele matricii, dar cu conditia
0 1 1 0
suplimentara i≠k si j≠k. Asadar la a doua
transformare nu vor fi analizate elementele de
0 0 1 1
pe linia 2 si coloana 2.
A
Dintre restul elementelor se repereaza cele
0 0 0 0
egale cu 0, adica:
a[1,1], a[1,4], a[3,1], a[3,3], a[3,4], a[4,4] 1 0
1 1
a[i,j]:=a[i,k]*a[k,j]
a[1,1]:=a[1,4]*a[4,1]=1
a[2,1]:=a[2,4]*a[4,1]=1 1 1 1 1
a[2,2]:=a[2,4]*a[4,2]=1 1 1 1 1
A
a[3,1]:=a[3,4]*a[4,1]=0 0 0 0 0
1 0
a[3,2]:=a[3,4]*a[4,2]=0 1 1
a[3,3]:=a[3,4]*a[4,3]=0
back aplicatie
Reprezentarea grafului ca un
vector de muchii
Fiecare arc al grafului poate fi privit ca o înregistrare cu două componente, în speţă
cele două noduri care constituie extremităţile arcului:
nod_in -> nodul din care iese arcul (“nodul de început” al arcului);
nod_sf -> nodul în care intră arcul (“nodul de sfârşit” al arcului);
Putem defini tipul de date ARC, astfel:
type ARC=record
nod_in, nod_sf: integer;
end;
Graful în ansamblul său, este o mulţime de arce, adică o mulţime de elemente de tipul
ARC. În consecinţă, definim graful ca un “vector de arce”, adică un vector de elemente
de tipul ARC:
var v: array [1..25] of ARC;
Numărul real de elemente este numărul de arce m. Astfel, elementele efectiv folosite
ale vectorului vor fi v[1], v[2],..., v[m]. Fiecare element {1, 2, ..., m}) este de tipul ARC
şi reprezintă unv[i] (cu i arc al grafului, având două componente:
v[i].nod_in şi v[i].nod_sf -> nodurile extremităţi ale arcului.
home