Sunteți pe pagina 1din 30

GRAFURI Anghel Gabriel

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

 Se numeste graf partial al grafului G=(X,U) un


graf neorientat G’=(X,V), unde VX. Altfel
spus, un graf G’ a lui G, este chiar G sau se
obtine din G pastrand toate varfurile si
suprimand niste muchii. 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.

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:

nodul lista vecinilor


linia
1 2, 3, 4 0 1 1 1 1
1 0 1 0 2
2 1, 3 A= 1 1 0 1 3
3 1, 2, 4 coloana 1
1 0
2
1
3
0
4
4

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 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={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: 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:

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 xX, 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

 Numim graf orientat, o pereche ordonată de


mulţimi G=(X,U), unde:
 X este o mulţime finită şi nevidă numită
mulţimea nodurilor (vârfurilor);
 U este o mulţime formată din perechi ordonate
de elemente ale lui X, numită mulţimea arcelor
(muchiilor). Muchiile sunt diferenţiate prin
ordinea de scriere a simbolurilor.
 Arcul (x,y) nu este tot una cu arcul (y,x).

back next
Exemplu graf orientat

 Pentru graful G=(X,U) din figura 1. avem: U1

X={1, 2, 3, 4} şi U={u1, u2, u3, u4, u5, u6, 1


u7,}= {(1,1), (2,1), (3,2), (2,3), (2,4), (3,4),
(3,4)} U2

 arc va fi de forma u= (x,y), unde x se 2

numeşte extremitate iniţială, iar y se U3

numeşte extremitate finală a arcului. Cu U4


U5

alte cuvinte, “arcul iese din nodul x şi intră


în nodul y”. La fel ca la grafurile 3
U6
neorientate, vom spune că nodurile x şi y 4

sunt adiacente, iar arcul u şi nodul x sunt U7


incidente (la fel arcul x şi nodul y). Nodul y
se numeşte succesor al lui x, iar nodul x se Figura1
numeşte predecesor al lui y. Un arc de
forma (x,x), care iese din nodul x şi intră tot
x, se numeşte buclă.
back
Graful unui vârf. Mulţimile
Γ şi ω
 Gradul exterior al unui vârf x, notat d+(x), reprezintă numărul arcelor
care ies din nodul x, adică numărul arcelor de forma (x,z) ε U.
 Analog, se defineşte gradul interior al unui vârf x, notat d-(x), ca fiind
numărul arcelor care intră în nodul x (de forma (y,x) ε U).
 → mulţimea nodurilor ce constituie extremităţi finale ale
arcelor care pleacă din nodul x. Pe scurt, mulţimea succesorilor lui x;
  x  y  X x, y→


Umulţimea nodurilor ce constituie extremităţi iniţiale ale
arcelor care pleacă din nodul x. Pe scurt, mulţimea predecesorilor lui
x;
 ω+(x)

x  y =X{u
 y, =
x(x,y)|
U u ε U} → mulţimea arcelor care ies din nodul x;
 ω-(x) = {u = (y,x)| u ε U} → mulţimea arcelor care intră în nodul x;

back
Graf parţial şi subgraf

 Fie graful G = (X,U). Un graf parţial al lui G, este un graf


G1= (X,V), cu . Altfel spus, un graf parţial G1 al lui G, este
chiar G, sau se obţine din G păstrând toate vârfurile şi
suprimând nişte muchii.
 Fie graful G = (X,U). Un graf parţial al lui G, este un graf
G1= (Y,T), unde şi , iar T va conţine numai muchiile care
au ambele extremităţi în Y. Altfel spus, un graf parţial G1
al lui G, se obţine din G eliminând nişte vârfuri şi păstrând
doar acele muchii care au ambele extremităţi în
mulţimea vârfurilor rămase.

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.

 Pentru graful G=(X,U) din figura 5, matricea de adiacenţă este:



2 3
coloana 1 2 3 4

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

 Este o matrice b cu n linii şi m coloane, în care fiecare element b[i,j] este:


1, dacă nodul i este o extremitate iniţială a arcului uj;
-1, dacă nodul i este o extremitate finală a arcului uj;
0, dacă nodul i nu este o extremitate a arcului uj.

 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

 L*(x) → lista vecinilor succesori; Figura 6

conţine nodurile ce sunt


extremităţi finale ale arcelor
care ies din nodul x. Nodul x L*(x) L-(x)
 L-(x) → lista vecinilor
1 2 vidă
predecesori; conţine nodurile ce
sunt extremităţi iniţiale ale 2 vidă 1,3,4
arcelor care intră în nodul x.
3 2,4 4

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

 Fie graful orientat G cu n=4 noduri şi matricea sa de


adiacenţă a:
2
0 1 1 0 1
 
0 0 1 1
A
0 0 0 0
 
1 0 
 1 0

Graful are n=4 noduri , deci matricea de adiacenta 3 4


va suferi patru transformari intr-un ciclu, pentru
k=1,2,3,4.
next
back
Pentru k=1
Se parcurg elementele matricii, dar cu 0 1 1 0
conditia suplimentara i≠k si j≠k. Asadar la  
prima transformare nu vor fi analizate 0 0 1 1
A
0
elementele de pe linia 1 si coloana 1.
Dintre restul elementelor se repereaza cele 0 0 0
 
egale cu 0, adica: 1 0 
a[2,2],a[3,2], a[3,3], a[3,4],a[4,3],a[4,4].  1 0
a[i,j]:=a[i,k]*a[k,j]
Matricea de adiacenta va
a[2,2]:=a[2,1]*a[1,2]=0
deveni:
a[3,3]:=a[3,1]*a[1,3]=0

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]

Matricea de adiacenta va deveni:


a[1,1]:=a[1,2]*a[2,1]=0
a[1,4]:=a[1,2]*a[2,4]=1
0 1 1 1
a[3,1]:=a[3,2]*a[2,1]=0  
0 0 1 1
a[3,3]:=a[3,2]*a[2,3]=0 A
0 0 0 0
a[3,4]:=a[3,2]*a[2,4]=0  
a[4,4]:=a[4,2]*a[2,4]=1 1 1 
 1 1
back
next
Pentru k=3
Se parcurg elementele matricii, dar cu 0 1 1 0
conditia suplimentara i≠k si j≠k. Asadar la  
a treia tranformare nu vor fi analizate 0 0 1 1
elementele de pe linia 3 si coloana 3. A
Dintre restul elementelor se repereaza cele 0 0 0 0
egale cu 0, adica:  
1 1 
a[1,1], a[1,4], a[2,1], a[2,2]
 1 1
a[i,j]:=a[i,k]*a[k,j]
Matricea de adiacenta va deveni:
a[1,1]:=a[1,3]*a[3,1]=0
a[1,4]:=a[1,3]*a[3,4]=0
0 1 1 1
a[2,1]:=a[2,3]*a[3,1]=0  
0 0 1 1
a[2,2]:=a[2,3]*a[3,2]=0 A
0 0 0 0
 
1 1 
 1 1
back
next
Pentru k=4
Se parcurg elementele matricii, dar cu conditia 0 1 1 1
suplimentara i≠k si j≠k. Asadar la ultima  
tranformare nu vor fi analizate elementele de pe 0 0 1 1
A
0
linia 4 si coloana 4.
Dintre restul elementelor se repereaza cele 0 0 0
 
egale cu 0, adica: 1 1 
a[1,1], a[2,1], a[2,2], a[3,1], a[3,2], a[3,3]  1 1
a[i,j]:=a[i,k]*a[k,j]
Matricea drumurilor va deveni:

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ă unv[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

S-ar putea să vă placă și