Sunteți pe pagina 1din 34

10.1.

Grafuri neorientate
10.1.1. Noiuni teoretice
Definiie. Se numete graf neneorientat o pereche ordonat de mulimi ( X , U ), X
fiind o mulime finit i nevid de elemente, numite vrfuri, iar U o mulime de
perechi neordonate din X, numite muchii.
Notm G = ( X , U ) un graf neneorientat
X se numete mulimea vrfurilor
U se numete mulimea muchiilor
Fie u U care trece prin x, y. Atunci u = [ x , y ] sau u = ( x , y )
Definiie. Pentru o muchie u = [ x , y ] :
vrfurile x i y sunt adiacente i se numesc extremitile muchiei u;
muchia u i vrful x sunt incidente n graf;
muchia u i vrful y sunt incidente n graf;
Observaie. [ x , y ] = [ y , x ] deoarece nu exist o orientare a muchiei
Exemplu. Fie G = ( X , U ) astfel nct :
X = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 }
U = { [ 1 , 5 ] , [ 3 , 7 ] , [ 4 , 6 ] , [ 9 , 8 ] , [ 10 , 2 ] , [ 1 , 2 ] , [ 9 , 4 ] , [ 1 ,
10] , [ 6 , 8 ] }
1 10 3 7

4 6 11
5 2
9 8
Definiie. Gradul unui varf x, notat d ( x ), reprezint numrul muchiilor care
trec prin vrful x ( incidente cu vrful x ).
Definiie. Un varf care are gradul 0, se numete vrf izolat.
Un vrf care are gradul 1, se numete vrf terminal.
Exemplu. d ( 1 ) = 3; d ( 2 ) = 2; d ( 4 ) = 2; d ( 6 ) = 2; d ( 8 ) = 2; d ( 9 ) = 2; d
( 10 ) = 2;
d ( 11 ) = 0 11 = vrf izolat
d ( 3 ) = 1; d ( 5 ) = 1; d ( 7 ) = 1 3 , 5 , 7 = vrfuri terminale
Definiie. Fie graful G=(X,U). Un graf parial al lui G, este un graf G
1
=(X,V)
astfel nct V U, adic G
1
are aceeai mulime de vrfuri ca G, iar mulimea de
muchii V este chiar U sau o submulime a acesteia.
Exemplu. G
1
= ( X , V ) V = { [ 1 , 5 ] , [ 2 , 10 ] , [ 6 , 4 ] }
1 2 3 7
5 10 4 6 11 9
8

Definiie. Fie G = ( X , U ). Un subgraf al lui G, este un graf G
1
= ( Y , T ) astfel
nct Y X, iar T conine toate muchiile din U care au ambele extremiti n Y ( se
obine din G eliminnd o parte din vrfuri i toate muchiile incidente la acestea ).
Exemplu. Y = { 1 , 2 , 3 , 7 , 10 } T = { [ 1 , 2 ] , [ 1 , 10 ] , [ 2 , 10 ] , [ 3 ,
7 ] }
1 2 3 7
10
Definiie. Se numete graf complet cu n vrfuri, notat K
n
, un graf G = ( X , U )
care are proprietatea c oricare 2 vrfuri diferite sunt adiacente, adic :
x , y X u = [ x , y ] U
Exemplu. graf complet cu 5 vrfuri K
5
Un graf complet cu n noduri are n*(n-1)/2 muchii.
Definiie. Se numete graf bipartit, un graf G = ( X , U ) cu proprietatea c
exist 2 mulimi A i B incluse n X, astfel nct :
A U B = X , A B =
toate muchiile grafului au o extremitate n A i cealalt n B.
Exemplu. graf bipartit A = { 1 , 2 , 4 } B = { 3 , 5 , 6 , 7 }
Definiie. Se numete graf bipartit complet, un graf bipartit cu proprietatea c
pentru orice vrf x din A i orice vrf y din B, exist muchia [ x , y ].
Exemplu. graf bipartit complet A = { 1 , 3 , 4 } B = { 2 , 5 }
1
2
4
3
5
6
7
1
2
3 4
5
1
3
4
2
5

Definiie. Se numete lan n graful G, o succesiune de vrfuri L = ( z
1
, z
2
, ,
z
k
), unde z
1
, z
2
, , z
k
X, astfel nct oricare dou vrfuri consecutive sunt
adiacente, adic [ z
1
, z
2
] , [ z
2
, z
3
] , , [ z
k1
, z
k
] U.
Vrfurile z
1
i z
k
se numesc extremitile lanului.
Numrul de muchii care intr n componena sa reprezint lungimea lanului.
Dac vrfurile z
1
, z
2
, , z
k
sunt distincte dou cte dou, lanul se numete
elementar. n caz contrar, lanul se numete neelementar.
Exemplu:
Lant elementar:1,2,3,4,5;
6,7,3,9,4,8
Lant neelementar: 1,2,3,2;

Definiie. Se numete ciclu ntrun graf, un lan L = ( z
1
, z
2
, , z
k
) cu
proprietatea c z
1
= z
k
i muchiile [ z
1
, z
2
] , [ z
2
, z
3
] , , [ z
k1
, z
k
] sunt
distincte dou cte dou.
Dac ntrun ciclu, toate vrfurile cu excepia primului i a ultimului sunt distincte
dou cte dou, atunci ciclul se numete elementar. n caz contrar se numete
neelementar.
Exemplu: c1=(3,4,5,3,7,6,1,2,3) ciclu neelementar
c2=(1,2,3,7,6,1) ciclu elementar
Reprezentarea grafurilor neneorientate
Fie G = ( X , U ) cu m muchii i n vrfuri numerotate 1, 2, , n.
1. Reprezentare prin matrice de adiacen.
a M
n x n
a [ i , j ] =

'


contrar caz in , 0
j i cu ] j , i [ daca , 1
Observaie. Pentru orice graf neneorientat, matricea de adiacen a este simetric
fa de diagonala principal.
2 3
1 4

,
_


0 1 1 0
1 0 1 0
1 1 0 1
0 0 1 0
a
2. Reprezentare prin liste de adiacen
Nodul Lista de
adiacen
1
2
3
4
2
1 , 3 , 4
2 , 4
2 , 3
Proprieti ale grafurilor neneorientate
Teorem. ntrun graf G = ( X , U ) cu n vrfuri i m muchii, suma gradelor
tuturor vrfurilor este egal cu dublul numrului de muchii.
d ( x
1
) + d ( x
2
) + + d ( x
n
) = 2 m
Consecin. n orice graf exist un numr par de vrfuri cu grade impare.
Teorem. Numrul total de grafuri neneorientate cu n vrfuri este 2
n * ( n 1 ) / 2
.
Teorem. Un graf complet cu n vrfuri, are n ( n 1 ) / 2 muchii.
Conexitate. Descompunerea unui graf n componente conexe
Definiie. Un graf G este conex, dac oricare ar fi dou vrfuri ale sale, exist un
lant care le leag.
Observaie. Dac graful nu este conex, un graf poate fi descompus n componente
conexe.
Definiie. Se numete component conex a grafului G = ( X , U ), un subgraf
G
1
= ( X
1
, U
1
) a lui G, conex, cu proprietatea c nu exist nici un lan care s lege
un vrf din X
1
cu un vrf din X X
1
.
Exemplu.
Grafuri hamiltoniene i euleriene
Definiie. Se numete ciclu hamiltonian ntrun graf, un ciclu elementar care
conine toate vrfurile grafului.
Se numete graf hamiltonian, un graf care conine un ciclu
hamiltonian. Un graf complet este hamiltonian.
Se numete lan hamiltonian ntrun graf, un lan elementar care
conine toate vrfurile grafului.

Teorem. Dac ntrun graf G = ( X , U ) cu n >= 3 vrfuri, gradul fiecrui vrf x
verific condiia d ( x ) >= n/2, atunci graful este hamiltonian.
Definiie. Se numete ciclu eulerian ntrun graf, un ciclu care conine toate
muchiile grafului.
Se numete graf eulerian, un graf care conine un ciclu eulerian.
Teorem. Un graf fr vrfuri izolate este eulerian, dac i numai dac este
conex, i gradele tuturor vrfurilor sunt numere pare.
Exemplu. Graf hamiltonian Graf eulerian
10.1.2. Itemi cu alegere multipl
1. Cte grafuri neneorientate, distincte, cu 5 vrfuri se pot construi?
a) 2
30
b) 2
15
c)4
15
d) 4
30
2. ntr-un graf neneorientat cu 15 muchii, fiecare nod al grafului are gradul diferit de
0. Doar trei dintre noduri au gradul un numr par, restul nodurilor avnd gradele
numere impare. Care este numrul maxim de noduri pe care poate s le aib graful?
a) 27 b) 24 c) 32 d) 16
3. Se consider graful neneorientat cu 6 noduri, numerotate de la 1 la 6 i muchiile
[1,2], [1,6], [2,3], [3,4],[3,5],[3,6],[4,5],[5,6]. Nodurile cu grad minim sunt :
a) 1,3,4 b) 1,2,6 c) 1,2,4 d)1,2,3
4. Se consider graful neneorientat cu 7 noduri numerotate de la 1 la 7 i muchiile
[1,2], [1,4], [1,5], [2,5],[2,6],[3,4],[3,7],[4,5] ,[6,7]. Care din urmtoarele succesiuni
de noduri reprezint un lan care trece o singur dat prin toate nodurile grafului ?
a) 1,7,2,4,3,6,5 b) 1,6,2,4,5,3,7 c) 1,5,6,7,2,3,4 d) 1,2,5,4,3,7,6
5. Se consider graful neneorientat reprezentat prin matricea de adiacen alturat.
Cte dintre vrfurile grafului au gradul impar?
0 1 1 1 0
1 0 0 0 1
1 0 0 1 0
1 0 1 0 1
0 1 0 1 0
a) 3 b) 2 c) 5 d) 1
6. Fie graful neneorientat cu 6 noduri, numerotate de la 1 la 6 i muchiile [1,2], [1,3],
[1,4], [2,3],[2,4],[3,4],[3,5],[4,5] ,[4,6], [5,6] . Numrul maxim de muchii care poate fi
eliminat astfel nct graful parial obinut s fie hamiltonian este:
a) 4 b) 5 c) 2 d) 3
7. Fie graful neneorientat cu 9 noduri, numerotate de la 1 la 9 i muchiile [1,2], [2,3],
[3,7], [4,8],[4,5],[4,6],[5,9],[6,9],[7,8],[6,7],[1,7] . Numrul minim de muchii care
poate fi adugat astfel nct graful s devin eulerian este:
1
2 3
4
5
2
3 4 5
6
7
8
1

a) 4 b) 5 c) 2 d) 3
8. Se consider graful neneorientat reprezentat prin matricea de adiacen alturat.
Care este lista de adiacen corespunztoare grafului?
0 1 1 1 0
1 0 0 0 1
1 0 0 1 0
1 0 1 0 1
0 1 0 1 0
a) 1: 2,3 b) 1: 2,3,5 c) 1: 3,4 d) 1: 2,3,4
2: 1,4 2: 1,5 2: 1,3,5 2: 1,5
3: 2,5 3: 1,4 3: 2,4,5 3: 1,4
4: 1,3,5 4: 1,3,5 4: 1,3,5 4: 1,3,5
5: 2,4 5: 1,2,3 5: 2,4 5: 2,4
9. Care este numrul minim de muchii ce trebuie eliminat din graful alturat astfel
nct graful parial obinut s nu fie conex?
a) 1 b) 2 c) 3 d) 0
10. Fie graful neneorientat cu 6 noduri, numerotate de la 1 la 6 i muchiile [1,2],
[1,3], [1,4], [2,3],[2,4],[3,4],[3,5],[4,5] ,[4,6], [5,6] . Matricea de adiacen
corespunztoare grafului este:
a) 1 0 0 1 1 1 b) 0 1 1 1 0 0 c) 0 1 1 1 1 0 d) 0 1 0 1 0 0
1 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0
1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0
1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 0
0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0
10.1.3. Probleme rezolvate
1. Se d un graf cu n noduri prin matricea de adiacen. S se scrie un program care
afieaz lista vecinilor corespunztoare grafului.
Exemplu: n=4 0 1 1 1
1 0 0 1
1 0 0 0
1 1 0 0 se va afia 1: 2,3,4
1
2
5
3
4

2: 1,4
3: 1
4: 1,2
Rezolvare
#include<iostream.h>
int n,i,j,a[20][20];
void main()
{cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) cin>>a[i][j];
for(i=1;i<=n;i++)
{cout<<i<<":";
for(j=1;j<=n;j++)
if(a[i][j]==1) cout<<j<<" ";
cout<<endl;
}}
2. S se verifice dac un ir de k noduri reprezint un lan ntr-un graf neneorientat
memorat cu ajutorul matricei de adiacen.
Exemplu: n=5, k=4, irul 1, 2, 3, 4 i matricea de adiacen 0 1 0 1 0
1 0 1 0 0
0 1 0 1 0
1 0 1 0 1
0 0 0 1 0 se va
afia Da
Rezolvare
#include <iostream.h>
int b,n,i,j,a[20][20],v[20],k;
void main()
{cin>>n;
for(i=1;i<=n;i++)
for (j=1;j<=n;j++)
cin>>a[i][j];
cin>>k;
for(i=1;i<=k;i++)
cin>>v[i];
b=1;
for(i=1;i<k;i++)
if(a[v[i]][v[i+1]]!=1) b=0;
if (b) cout<<"DA";
else cout<<"NU";
}
3. Se d un graf cu n noduri prin matricea de adiacen. S se scrie un program care
afieaz cte dintre nodurile grafului au grad par i cte grad impar.
Exemplu: n=4 0 1 1 1
1 0 0 1
1 0 0 0
1 1 0 0 se va afia par 2
impar 2

Rezolvare
#include<iostream.h>
int n,i,j,a[20][20],sp=0,si=0,s;
void main()
{cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) cin>>a[i][j];
for(i=1;i<=n;i++)
{s=0;
for(j=1;j<=n;j++)
s=s+a[i][j];
if(s%2==0) sp++;
else si++;
}
cout<<"Noduri cu grad par:"<<sp<<endl;
cout<<"Noduri cu grad impar:"<<si;}
4. Prin parcurgearea unui graf nelegem vizitarea nodurilor grafului o singur dat
fiecare, dup o anumit regul.
Parcurgerea n lime (BF- breadth first)
ncepem parcurgerea grafului n lime dintr-un nod i, pe care l
considerm vizitat.
Vizitm apoi rnd pe rnd toate nodurile adiacente cu nodul i, nc
nevizitate.
Pentru fiecare nod vizitat, vom vizita n continuare toate nodurile adiacente
cu el, nc nevizitate i aa mai departe, pn cnd nu mai gsim noduri
nevizitate adiacente cu nodurile vizitate deja.
Parcurgerea nodurilor n lime nu d o soluie unic, soluia depinde de ordinea
parcurgerii nodurilor adiacente.
La implementare pentru memorarea nodurilor vizitate vom utiliza o structur de
tip coad, pe care o vom memora ntr-un vector. Se va mai folosi un vector viz care
reine informaii referitoare la nodurile care au fost vizitate astfel:
viz [ i ] =

'

at fost vizit a nu i nodul daca , 0


at fost vizit a i nodul daca , 1
Rezolvare:
#include<iostream.h>
int n,i,j,a[20][20],viz[20],c[20],ic=1,sc=1,m;
void main()
{cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) cin>>a[i][j];
cout<<"Nodul de pornire:"; cin>>m;
c[ic]=m;
cout<<m<<" ";
viz[m]=1;

while(ic<=sc)
{
for(i=1;i<=n;i++)
if (a[c[ic]][i]&& !viz[i]) {sc++;
c[sc]=i;
cout<<i<<" ";
viz[i]=1;}
ic++;
}}
Parcurgerea n adncime (DF- depth first)
ncepem parcurgerea grafului n lime dintr-un nod i, pe care l
considerm vizitat.
Vizitm apoi primul nod adiacent cue l, nc nevizitat i aa mai departe
pn cnd ajungem la un nod care nu mai are noduri adiacente cu el
nevizitate.
Revenim la ultimul nod vizitat care mai are noduri adiacente cu el nc
nevizitate i relum algoritmul. Parcurgerea se termin cnd nu mai exist
noduri adiacente nevizitate cu nici un nod parcurs deja.
Parcurgerea nodurilor n adncime nu d o soluie unic, soluia depinde de
ordinea parcurgerii nodurilor adiacente.
La implementare pentru memorarea nodurilor vizitate vom utiliza o structur de
tip stiv, pe care o vom memora ntr-un vector. Se va mai folosi un vector viz care
reine informaii referitoare la nodurile care au fost vizitate astfel:
viz [ i ] =

'

at fost vizit a nu i nodul daca , 0


at fost vizit a i nodul daca , 1
Rezolvare:
#include<iostream.h>
int n,i,j,a[20][20],viz[20],m;
void adancime(int nod)
{ int i;
cout<<nod<<" ";
viz[nod]=1;
for(i=1;i<=n;i++)
if(a[nod][i]&&!viz[i]) adancime(i);
}
void main()
{cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) cin>>a[i][j];
cout<<"Nodul de pornire:"; cin>>m;
adancime(m);}
5. Se d un graf neneorientat prin matricea de adiacen. S se scrie un program care
determin componentele conexe ale grafului.
Rezolvare:

#include<iostream.h>
int n,i,j,a[20][20],viz[20],s[20],m,k=0;
void adancime(int nod)
{ int i;
cout<<nod<<" ";
viz[nod]=1;
for(i=1;i<=n;i++)
if(a[nod][i]&&!viz[i]) adancime(i);
}
void main()
{cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) cin>>a[i][j];
cout<<"Nodul de pornire:"; cin>>m;
for (i=1;i<=n;i++)
if(!viz[i]) {k++;
cout<<"Componenta "<<k<<":";
adancime(i);
}}
10.1.4. Probleme propuse
1. S se scrie un algoritm care verific dac un graf neneorientat memorat prin
matricea de adiacen este sau nu conex.
2. Se d un graf neorientat cu n noduri memorat prin matricea de adiacen i dou
noduri x i y. S se determine toate ciclurile elementare avnd ca extremiti nodurile
date, daca exist, altfel s se afieze mesajul Nu exist!.
3. Se d un graf neorientat cu n noduri memorat prin matricea de adiacen. S se
determine toate lanurile de lungime k din graf, unde k este numr natural citit de la
tastatur.
4. Se d un graf neorientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care construiete n memorie matricea de adiacen i verific dac graful
este sau nu hamiltonian.
5. Se d un graf neorientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care construiete n memorie matricea de adiacen i verific dac graful
este sau nu eulerian.
6. Se d un graf neorientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care construiete n memorie matricea de adiacen i verific dac o
succesiune de noduri dat de la tastatur este sau nu ciclu n graful dat.
7. Se d un graf neorientat cu n noduri memorat prin matricea de adiacen. S se
determine toate ciclurile de lungime k din graf, unde k este numr natural citit de la
tastatur.

8. Pentru un graf cu n vrfuri i m muchii s se construiasc un subgraf cu k vrfuri,
unde k este un numr natural citit de la tastatur i gradul tuturor nodurilor este numr
par. Dac acest lucru nu este posibil se va afia mesajul Nu se poate!.
9. S se verifice dac un graf memorat prin matricea de adiacen are fa uman,
adic are exact 3 componente conexe: una cu 2 vrfuri, una cu 3 vrfuri i una cu 4
vrfuri.
10. Se d un graf care are toate vrfurile de grad impar. S se scrie un algoritm care
determin toate ciclurile elementare ale grafului.
11. Se d un graf neorientat cu n noduri memorat prin matricea de adiacen i dou
noduri x i y. S se determine toate lanurile hamiltoniene avnd ca extremiti
nodurile date, daca exist, altfel s se afieze mesajul Nu exist!.
12. Se d un graf neorientat cu n noduri memorat prin matricea de adiacen i un nod
x. S se determine toate ciclurile euleriene avnd ca extremiti nodul dat, daca exist,
altfel s se afieze mesajul Nu exist!.
13. Se d un graf neorientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care construiete n memorie matricea de adiacen i afieaz subgraful
obinut prin eliminarea nodului de grad maxim.
14. S se scrie un program care pentru un graf memorat prin matricea de adiacen, cu
n noduri, determin numrul de muchii al grafului i determin subgraful cu numr
minim de vrfuri i cu proprietatea c orice vrf al su are gradul cel puin egak cu 2.
Dac nu exist un astfel de subgraf s se afieze mesajul Nu exist!.
15. Se d un graf neorientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care determin cel mai lung lan elementar din graf i l afieaz.
10.2. Grafuri orientate
10.2.1. Noiuni teoretice
Definiie. Se numete graf orientat o pereche ordonat de mulimi ( X , U ), unde :
X este o mulime finit i nevid de elemente, numite noduri sau vrfuri;
U este o mulime de perechi ordonate din X, numite arce.
X se numete mulimea nodurilor sau vrfurilor
U se numete mulimea arcelor
Definiie. Pentru un arc u = [ x , y ] :
x se numete extremitatea iniial, iar y se numete extremitatea final a arcului;
nodurile x i y sunt adiacente;
arcul u i nodul x sunt incidente n graf;
arcul u i nodul y sunt incidente n graf;
nodul y se numete succesor al lui x;

nodul x se numete predecesor al lui y.
Definiie. Un arc de forma [ x , x ] se numete bucl.
Observaie. [ x , y ] [ y , x ] deoarece exist o orientare a arcului
Exemplu. Fie G = ( X , U )
X = { 1 , 2 , 3 , 4 }
U = { [ 1 , 1 ] , [ 2 , 1 ] , [ 3 , 2 ] , [ 2 , 3 ] , [ 2 , 4 ] , [ 3 , 4 ] , [ 3 , 4 ] }
Definiie. Gradul exterior al unui vrf x, notat d
+
( x ), reprezint numrul
arcelor care ies din nodul x, adic numrul arcelor de forma [ x , y ] U.
Definiie. Gradul interior al unui vrf x, notat d

( x ), reprezint numrul
arcelor care intr n nodul x, adic numrul arcelor de forma [ y , x ] U.
Exemplu. d
+
( 2 ) = 3 d

( 2 ) = 1
Definiie.
+
( x ) = { y X | ( x , y ) U } mulimea succesorilor lui x

( x ) = { y X | ( y , x ) U } mulimea predecesorilor lui x


Exemplu.
+
( 2 ) = { 1 , 3 , 4 }

( 2 ) = { 3 }
Definiie.
+
( x ) = { u = ( x , y ) | u U } mulimea arcelor care ies din
nodul x

( x ) = { u = ( y , x ) | u U } mulimea arcelor care intr n


nodul x
Exemplu.
+
( 2 ) = { ( 2 , 1 ) , ( 2 , 3 ) , ( 2 , 4 ) }

( 2 ) = { ( 3 , 2 ) }
Definiie. Fie graful G=(X,U). Un graf parial al lui G, este un graf G
1
=(X,V)
astfel nct V U, adic G
1
are aceeai mulime de noduri ca G, iar mulimea de arce
V este chiar U sau o submulime a acesteia.
Exemplu. G
1
= ( X , V ) V = { [ 2 , 1 ] , [ 3 , 2 ] , [ 4 , 3 ] , [ 5 , 6 ] , [ 6 , 4 ] }
Definiie. Fie G = ( X , U ). Un subgraf al lui G, este un graf G
1
= ( Y , T ) astfel
nct Y X, iar T conine toate arcele din U care au ambele extremiti n Y ( se
obine din G eliminnd o parte din noduri i pstrnd acele arce care au ambele
extremiti n mulimea nodurilor rmase ).
Exemplu. Y = { 3 , 4 , 5 , 6 } T = { [ 4 , 3 ] , [ 3 , 5 ] , [ 5 , 6 ] , [ 6 , 4 ] }
1 2
4
3
5
6
u
2
u
1
u
3
u
4 u
5
u
7
u
6
1 2
4
3
5
6
u
2
u
3
u
4
u
7
u
6
G=(X,U) Graf partial
1 2
4
3
5
6
u
2
u
1
u
3
u
4 u
5
u
7
u
6
4
3
5
6
u
4 u
5
u
7
u
6
G=(X,U)

Definiie. Se numete lan ntrun graf orientat, o mulime de arce L = { u
1
, u
2
,
, u
k
}, cu proprietatea c oricare dou arce vecine n mulime au o extremitate
comun.
Definiie. Se numete drum n graful G, o succesiune de noduri D = ( z
1
, z
2
,
, z
k
), unde z
1
, z
2
, , z
k
X, astfel nct oricare dou noduri consecutive sunt
adiacente, adic [ z
1
, z
2
] , [ z
2
, z
3
] , , [ z
k1
, z
k
] U.
Nodurile z
1
i z
k
se numesc extremitile drumului.
Numrul de arce care intr n componena sa reprezint lungimea drumului.
Dac nodurile z
1
, z
2
, , z
k
sunt distincte dou cte dou, drumul se
numete elementar. n caz contrar, drumul se numete neelementar.
Definiie. Se numete circuit ntrun graf, un drum D = ( z
1
, z
2
, , z
k
) cu
proprietatea c z
1
= z
k
i arcele [ z
1
, z
2
] , [ z
2
, z
3
] , , [ z
k1
, z
k
] sunt distincte
dou cte dou.
Dac ntrun circuit, toate nodurile cu excepia primului i a ultimului sunt
distincte dou cte dou, atunci circuitul se numete elementar. n caz contrar,
circuitul se numete neelementar.
Exemple. L
1
= ( u
1
, u
4
, u
7
) lanul cu extremitile 1 i 6
L
2
= ( u
2
, u
3
, u
5
, u
6
) lanul cu extremitile 1 i 6
D
1
= ( 1 , 3 , 5 , 6 , 4 , 3 , 2 ) neelementar
D
2
= ( 3 , 5 , 6 , 4 , 3 , 5 ) neelementar
D
3
= ( 2 , 1 , 3 , 5 , 6 , 4 ) elementar
C
1
= ( 4 , 3 , 2 , 1 , 3 , 5 , 6 , 4 ) neelementar
C
2
= ( 3 , 5 , 6 , 4 , 3 ) elementar
C
3
= ( 1 , 3 , 2 , 1 ) elementar
Reprezentarea grafurilor orientate
Fie G = ( X , U ) cu m arce i n noduri.
1. Reprezentare prin matrice de adiacen.
A M
n x n
a [ i , j ] =

'


contrar caz in , 0
j i cu ] j , i [ daca , 1
Observaie. Matricea de adiacen nu este simetric fa de diagonala principal.
Subgraf

2. Reprezentare prin matricea vrfuri arce
b M
n x m
b [ i , j ] =

'

j
u arcului a e extremitat este nu i nodul daca , 0
j
u arcului a finala e extremitat este i nodul daca , 1 -
j
u arcului a initiala e extremitat este i nodul daca , 1
3. Reprezentare prin matricea drumurilor
d M
n x n
d [ i , j ] =

'

contrar caz in , 0
graf in j nodul la i nodul la de drum exista daca , 1
Exemplu.

,
_


0 0 1 0 0 0
1 0 0 0 0 0
0 0 0 1 0 0
0 1 0 0 1 0
0 0 0 0 0 1
0 0 0 1 0 0
a

,
_

1 1 - 0 0 0 0 0
0 1 1 - 0 0 0 0
1 - 0 0 1 0 0 0
0 0 1 1 - 1 0 1 -
0 0 0 0 1 - 1 0
0 0 0 0 0 1 - 1
b

,
_


1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
d
3. Reprezentare prin vector de muchii
struct muchie {
int nod_initial , nod_final ;
};
muchie v[50] ;
5. Reprezentare prin liste de vecini
L
+
( x ) lista vecinilor succesori; conine nodurile ce sunt extremiti finale ale
arcelor care ies din nodul x
L

( x ) lista vecinilor predecesori; conine nodurile ce sunt extremiti iniiale


ale arcelor care intr n nodul x
Nodul L
+
( x ) L

( x )
1
2
3
4
3
1
2 , 5
3
2
3
1 , 4
6

5
6
6
4
3
5
Algoritmul lui Roy Warshall de determinare a matricei drumurilor
Matricea drumurilor se obtine din matricea de adiacenta prin transformari
successive.
Spunem ca exista drum de la i la j daca gasim un nod k astfel incat sa existe
drum de la i la k si de la k la j.
Un element a[i][j] poate deveni 1 daca a[i][k]=1 si a[k][j]=1.
Pentru a gasi arcele nodului k trebuie parcurse pe rand in variabila k toate
nodurile de la 1 la n.
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if ((d[i,j]==0) && (i<>k) && (j<>k)) d[i,j]=d[i,k]*d[k,j];
Conexitate n grafuri orientate
Descompunerea unui graf orientat n componente conexe
Definiie. Un graf G este conex, dac oricare ar fi dou noduri ale sale, exist un
lant care le leag.
Observaie. Dac graful nu este conex, atunci poate fi descompus n componente
conexe.
Definiie. Se numete component conex a grafului G = ( X , U ), un subgraf
G
1
=( X
1
, U
1
) a lui G, conex, cu proprietatea c nu exist nici un lan care s lege un
nod din X
1
cu un nod din X X
1
.
Exemplu. Graf neconex :
Tare conexitate n grafuri orientate
Descompunerea unui graf orientat n componente tare conexe
Definiie. Un graf orientat G = ( X , U ) este tare conex, dac pentru oricare dou
noduri x i y X, exist un drum de la x la y precum i un drum de la y la x.
Observaie. Dac graful nu este tare conex, atunci poate fi descompus n
componente tare conexe.
Definiie. Se numete component tare conex a grafului orientat G = ( X , U ),
un subgraf G
1
= ( X
1
, U
1
) a lui G, tare conex, cu proprietatea c pentru orice nod x
X X
1
subgraful indus de X
1
{ x } nu mai este tare conex.
Drumuri minime i maxime n grafuri orientate

Algoritmul lui Dijkstra
Matricea costurilor
Fie un graf orientat G = ( X , U ) cu n noduri n care fiecrui arc i este asociat
un numr ntreg numit cost.
Matricea costurilor se definete astfel :
1. pentru determinarea drumurilor de cost minim :
c M
n x n
c [ i , j ] =

'

>
j si i intre arc exista nu daca ,
j i daca , 0
j si i nodurile intre 0 cost de arc un exista daca , cost
2. pentru determinarea drumurilor de cost maxim :
c M
n x n
c [ i , j ] =

'

>
j si i intre arc exista nu daca ,
j i daca , 0
j si i nodurile intre 0 cost de arc un exista daca , cost

- se selecteaza varfurile grafului unul cate unul in n-1 pasi in ordinea crescatoare a
costului drumului de la varful de start x la ele, intr-o multime care contine initial doar
varful de start se foloseste vectorul prec definit astfel:
prec[i]=k atunci k este varful precedent lui I pe drumul minim de la x la i
- se mai folosesc doi vectori d[i] reprezinta costul minim al drumului de la x la I si
s[i]=1 daca varful I a fost vizitat si 0 un caz contrar
Pasii care se executa in algoritmul lui Dijkstra:
1. se selecteaza varful de start
2. are loc repetarea urmatoarei secvente de cel mult n-2 ori:
2.1. se cauta varful k neselectat, cu d[k] minim si se selecteaza
2.2. se actualizeaza vectorul d pentru acele varfuri I neselectate dar pentru
care fostul d[i] este mai mic decat d[k]+costul arcului (k,i); astfel
d[i]=d[k]+c[k,i] iar prec[i]=k. Asadar drumul de la x la I are ca varf
intermediary nodul k care se afla inainte de i
3. la sfarsit folosind vectorul prec se afiseaza drumurile de la x la fiecare varf I
al grafului precum si costurile acestor drumuri
Algoritmul lui Roy Floyd
determin lungimea drumurilor minime ntre oricare dou noduri ale unui graf
graful este reprezentat prin matricea de costuri, c
dac de la nodul i la nodul j nu exist arc, c[i,j]=1000.
Plecm de la urmtoarea idee: dac drumul minim ntre dou noduri oarecare i
i j trece printr-un nod k, atunci drumurile de la i la k i de la k la j sunt la rndul lor
minime. Pentru fiecare pereche de noduri (i, j ), cu i, j {1,2,,n}, procedm astfel:
Dm lui k pe rnd valorile 1,2,,n, pentru ca nodul k despre care vorbeam
mai sus poate fi, cel puin teoretic, orice nod al grafului. Pentru fiecare k:
nod lista
1: 2,6,5
2: 3,4
3: 1
4: 5, 6
5: 6
6: 3
0 1 1 0 0 0 0
0 0 0 0 1 1 0
0 0 0 0 0 0 0
0 0 1 0 1 0 0
1 1 0 0 0 1 0
1 0 1 0 0 0 0
0 0 0 0 0 0 0
0 1 1 0 0 0 0
0 0 0 0 1 1 0
0 0 0 0 0 0 0
0 0 1 0 1 0 0
1 1 0 0 0 1 0
1 0 1 0 0 0 0
0 1 0 1 0 0 0
nod lista
1: 3
2: 1,3,5,6
3: -
4: 3
5: -
6: 4,5

dac suma dintre costul drumului de la i la j i costul drumului de
la k la j este mai mic dect costul drumului de la i la j {a[i, k]+a[k,
j]<a[i, j]}, atunci drumul iniial de la i la j este nlocuit cu drumul
indirect ikj. aceast nlocuire firete c se va opera ca atare n
matrocea costurilor: {a[i, j]:=a[i, k]+a[k, j]}.
10.2.2. Itemi cu alegere multipl
1. Cte noduri are graful orientat cu 6 noduri i urmtoarele arce: (1,5), (1,6), (2,1),
(2,3), (3,1), (3,4), (4,3), (4,5), (5,4), (6,5) au gradul interior egal cu gradul exterior?
a) 2 b) 3 c) 6 d) 5
2. Se consider un graf orientat cu 8 noduri numerotate de la 1 la 8 i cu mulimea
arcelor format doar din arcele:
- de la fiecare nod numerotat cu numr prim i la nodurile numerotate cu numr par
- de la nodul 1 la nodul 6
- de la fiecare nod numerotat cu i impar la fiecare nod i+1.
Pentru graful dat care este cel mai lung drum format doar din noduri distincte care
unete nodul 2 cu nodul 8?
a) 2 b) 3 c) 4 d) 5
3. Se consider graful orientat reprezentat prin listele de adiacen
alturate. Cte noduri au gradul extern mai mic dect gradul intern?
a) 2 b) 3 c) 6 d) 5
4. Se consider graful orientat reprezentat prin matricea de adiacen
alturat. Care este lungimea maxim a unui drum de la varful 4 la
vrful 6 format din vrfuri distincte dou cte dou?
a) 4 b) 3 c) 6 d) 5
5. Se consider graful orientat reprezentat prin matricea de adiacen
alturat. Care sunt nodurile pentru care gradul interior este mai mic
dect gradul exterior?
a) 4, 5, 7 b) 3, 5 c) 6, 4, 7 d) 5, 6, 7
6. Care este numrul de circuite distincte ale grafului orientat dat
prin lista de adiacen alturat?
a) 0 b) 1 c) 2 d) 3
7. Se consider graful orientat cu 6 noduri i urmtoarele arce
(1,2), (1,5), (1,6), (2,3), (3,6), (4,1), (6,4). Care este nodul accesibil din toate celelalte
vrfuri prin intermediul unor drumuri elementare?

a) 6 b) 1 c) 5 d) 3
8. Cte grafuri orientate cu 5 vrfuri se pot construi?
a) 2
20
b) 2
15
c)4
15
d) 4
30
9. Gradul intern pentru nodul cu eticheta i dintr-un graf orientat la care se cunoate
matricea de adiacen este egal cu numrul de cifre egal cu 1 aflate pe:
a) linia i
b) diagonala principal
c) diagonala secundar
d) coloana i
10. Un graf orientat are 5 noduri numerotate de la 1 la 5 i 4 arce: (1,2), (2,1), (2,3),
(3,4). Prin eliminarea nodului 2 i a arcelor incidente cu acesta se obine:
a) un subgraf cu 4 noduri i un arc
b) un graf parial
c) un subgraf cu 4 noduri i nici un arc
d) un subgraf cu 3 noduri i 3 arce distincte
10.2.3. Probleme rezolvate
1. Fie un graf orientat memorat cu ajutorul matricei de adiacen. S se determine
vrfurile fiecrei componente tare conexe.
Exemplu:
n=7 i matricea 0 1 0 1 0 0 0
0 0 1 0 0 0 0
1 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 1
0 0 0 1 0 0 0
0 0 0 0 1 0 0 componentele tare conexe sunt: 1 2 3
5 7
4
6
Rezolvare:
#include<iostream.h>
int s[20],p[20], a[20][20],n,nrc,i,j;
void citire()
{
cin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
cin>>a[i][j];
}
void df1(int nod)
{ int k;
s[nod]=nrc;
for(k=1;k<=n;k++)

if(a[nod][k]==1 && s[k]==0) df1(k);
}
void df2(int nod)
{ int k;
p[nod]=nrc;
for(k=1;k<=n;k++)
if(a[nod][k]==1 && p[k]==0) df2(k);
}
void main()
{
citire();
nrc=1;
for(i=1;i<=n;i++)
if (s[i]==0) {s[i]=nrc;
df1(i);
df2(i);
for(j=1;j<=n;j++)
if(s[j]!=p[j]) {s[j]=0;p[j]=0;}
nrc++;
}
for(i=1;i<nrc;i++)
{
cout<< "Componenta "<<i<<endl;
for(j=1;j<=n;j++)
if(s[j]==i) cout<<j<<" ";
cout<<endl;
}}
2. Algoritmul lui Dijkstra Fie un graf orientat cu costuri asociate arcelor. Se d un varf
r de plecare, s se detrmine pentru orice pereche de vrfuri (r,x) costul drumului
minim care le unete.
Exemplu:
n=5 i matricea costurilor0 1 9 3
0 7 3
0
1 2 0
4 2 0 i nodul de plecare r=1 se va afia:
Drumul de cost minim de la 1 la 2 este: 1
Drumul de cost minim de la 1 la 3 este: 6
Drumul de cost minim de la 1 la 3 este: 4
Drumul de cost minim de la 1 la 5 este: 3
Rezolvare
#include<iostream.h>
int s[20],t[20],d[20],min,a[20][20],n,i,j,poz,r;
void citire()
{
cin>>n;
for (i=1;i<=n;i++)

for (j=1;j<=n;j++)
cin>>a[i][j];
}
void drum(int i)
{
if (t[i]) drum(t[i]);
cout<<i<<" ";
}
void main()
{citire();
cin>>r;
s[r]=1;
for(i=1;i<=n;i++)
{
d[i]=a[r][i];
if(r!=i) if(d[i]<32000) t[i]=r;
}
for(i=1;i<n;i++)
{
min=32000;
for(j=1;j<=n;j++)
if(s[j]==0)
if(d[j]<min) {min=d[j];
poz=j;
}
s[poz]=1;
for(j=1;j<=n;j++)
if(s[j]==0)
if(d[j]>d[poz]+a[poz][j]) {d[j]=d[poz]+a[poz][j];
t[j]=poz;
}}
for(i=1;i<=n;i++)
cout<<d[i]<<" " ;
cout<<endl;
for(i=1;i<=n;i++)
if(i!=r) if (t[i]) {
cout<<"Distanta de la "<<r<<" la "<<i<<" este: "<<d[i]<<endl;
drum(i);
cout<<endl;
}
else cout<<"Nu exista drum de la "<< r<<" la "<<i<<endl;
}
3. Algoritmul lui Roy Floyd Fiind dat un graf orientat cu costuri asociate arcelor, se
cere s se determine pentru oricare dou vrfuri lungimea minim a drumului care le
leag.
Rezolvare
#include<iostream.h>

int a[20][20],n;
void citire()
{int i,j;
cin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
cin>>a[i][j];
}
void drum(int i,int j)
{
int k=1, b=0;
while ((k<=n) && !b)
{if (i!=k && j!=k && a[i][j]==a[i][k]+a[k][j]) { drum(i,k);
drum(k,j);
b=1;
}
k++;
}
if(!b) cout<<j<<" ";
}
void sdrum(int ni, int nf)
{
if(a[ni][nf]<32000) {
cout<<"Drumul de la "<<ni<<" la "<<nf<<" are lungimea: "<<a[ni]
[nf]<<endl;
cout<<ni<<" ";
drum(ni,nf);
}
else cout<<"Nu exista drum de la "<<ni<<" la "<<nf;
}
void lung()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if (a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
}
void main()
{int ni,nf;
citire();
lung();
cin>>ni>>nf;
sdrum(ni,nf);
}

4. Fiind dat un graf orientat prin matricea de adiacen se cere s se determine, dac
exist, un ciclu hamiltonian.
Rezolvare
#include<iostream.h>
int n, s[20], a[20][20];
void citire()
{ int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
}
int succesor(int k)
{
if (s[k]++<n) return 1;
else return 0;
}
int valid (int k)
{
if(a[s[k-1]][s[k]]==0) return 0;
else for(int i=1;i<k;i++)
if (s[i]==s[k]) return 0;
if(k==n) if (a[s[k]][1]==0) return 0;
return 1;
}
void tipar()
{
for (int i=1;i<=n;i++)
cout<<s[i];
cout<<s[1]<<endl;
}
void back(int k)
{
if(k==n+1) tipar();
else
{
s[k]=1;
while(succesor(k))
if (valid(k)) back(k+1);
}
}
void main()
{citire();
s[1]=1;
s[2]=1;

back(2);
}
5. Algoritmul lui Roy Warshall pentru determinarea matricii drumurilor unui graf
orientat memorat prin intermediul matricei de adiacen.
Rezolvare
#include<iostream.h>
int n,d[20][20],i,j,k;
void main()
{
cin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
cin>>d[i][j];
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if ((d[i][j]==0) && (i!=k) && (j!=k)) d[i][j]=d[i][k]*d[k][j];
for(i=1;i<=n;i++)
{for (j=1;j<=n;j++)
cout<<d[i][j]<<" ";
cout<<endl;
}}
10.2.4. Probleme propuse
1. S se scrie un algoritm care verific dac un graf orientat memorat prin listele de
adiacen are noduri cu gradul intern nul.
2. Se d un graf orientat cu n noduri memorat prin matricea de adiacen i un nod x.
S se afieze nodurile legate de x prin drumuri de lungime impar, daca exist, altfel
s se afieze mesajul Nu exist!.
3. Se d un graf orientat memorat prin listele de adiacen. S se scrie un program
care verific dac o succesiune de noduri citit de la tastatura este sau nu lan in graful
dat i afieaz lungimea lanului.
4. Se d un graf orientat cu n noduri memorat prin matricea de adiacen. S se afieze
listele de adiacen corespunztoare grafului.
5. Se d un graf orientat cu n noduri memorat prin listele de adiacen. S se scrie un
algoritm care elimin arcul (x,y).
6. Se d un graf orientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care elimin din graf toate arcele corespunztoare vrfurilor cu grad minim.
7. Se d un graf orientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care construiete n memorie matricea de adiacen i verific dac acesta

conine lanuri de lungime k, unde k este un numr natural citit de la tastatur mai mic
dect n.
8. Se d un graf orientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care construiete n memorie matricea de adiacen i verific dac o
succesiune de noduri dat de la tastatur este sau nu ciclu n graful dat.
9. Pentru un graf cu n vrfuri i m muchii s se construiasc un subgraf cu k vrfuri,
unde k este un numr natural citit de la tastatur i gradul extern al tuturor nodurilor
este numr impar. Dac acest lucru nu este posibil se va afia mesajul Nu se poate!.
10. Se d un graf orintat in care are toate vrfurile au gradul intern par. S se scrie un
algoritm care determin toate ciclurile elementare ale grafului.
11. Se d un graf orientat cu n noduri memorat prin matricea de adiacen i dou
noduri x i y. S se determine toate vrfurile care au aceleai grade interne ca vrful x
i aceleai grade externe ca vrful y.
12. Se d un graf orientat cu n noduri memorat prin matricea de adiacen. S se
determine toate ciclurile care trec prin noduri cu gradul extern numr prim, daca
exist, altfel s se afieze mesajul Nu exist!.
13. Se d un graf orientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care construiete n memorie matricea de adiacen i afieaz subgraful
obinut prin eliminarea vrfurilor care au gradul intern egal cu gradul extern.
14. S se scrie un program care pentru un graf orientat memorat prin matricea de
adiacen, cu n noduri, determin numrul de arce ale grafului i determin subgraful
cu numr minim de vrfuri i cu proprietatea c orice vrf al su are gradul intern cel
puin egal cu 2 i gradul extern cel mult 3. Dac nu exist un astfel de subgraf s se
afieze mesajul Nu exist!.
15. Se d un graf orientat cu n noduri memorat prin lista de adiacen. S se scrie un
program care determin cel mai lung lan elementar din graf i l afieaz.
10.3. Arbori
10.3.1. Noiuni teoretice
Definiie. Un graf neorientat conex i fr cicluri se numete arbore.
Nodurile unui arbore pot fi aezate pe niveluri ncepnd cu rdcina care este plasat
pe nivelul 1.
Definiie. Rdcina este un nod special care genereaz aezarea unui arbore pe
niveluri. Aceast operaie se efectueaz n funcie de lungimea lanurilor prin care
celelalte noduri sunt legate de rdcin.
Definiie. Nodul y este descendentul nodului x dac este situat pe un nivel mai
mare dect nivelul lui x i exist un lan care le unete.

Defniie. Nodul y este fiul ( descendentul direct al ) nodului x dac este situat
pe nivelul imediat urmtor nivelului lui x i exist muchie ntre x i y.
Definiie. Nodul x este ascendentul nodului y dac este situat pe un nivel mai
mic dect nivelul lui y i exist un lan care le unete.
Definiie. Nodul x este printele ( ascendentul direct al ) nodului y dac este
situat pe nivelul imediat superior nivelului lui y i exist muchie ntre x i y.
Definiie. Nodul x este fratele nodului y dac au acelai printe.
Definiie. Nodul x este nod terminal ( frunz ) dac nu are nici un descendent
direct.


4
1
2
6
3
5 7
10 9
8
Niv 1
Niv 2
Niv 3
Niv 4
Arbore
Teorem. Un arbore cu n vrfuri are n 1 muchii.
Teorem. Fie un graf G=(X, U). urmtoarele afirmaii sunt echivalente:
1. G este arbore.
2. G este un graf conex, minimal cu aceast proprietate (eliminnd o muchie oarecare
se obine un graf neconex).
3. G este un graf fr cicluri, maximal cu aceast proprietate (dac se adaug o muchie
se obine un graf care are mcar un ciclu).
Definiie. Fie G un graf. Un graf parial H al su care n plus este i arbore se numete
arbore parial.
Corolar. Un graf G=(X, U) conine un arbore parial dac i numai dac G este conex.
Reprezentarea arborilor
Fie un arbore cu n noduri.
1. Reprezentare prin matrice de adiacen.
a M
n x n
a [ i , j ] =

'

contrar caz in , 0
j lui tatal este i daca , 1
Nodul 1 este rdcina arborelui.
Nodurile 5, 6, 7 sunt fiii nodului 3.
Nodul 7 este printele nodurilor 9 i 10.
Nodul 9 este descendentul nodului 3.
Nodul 3 este ascendentul nodului 10.
Nodurile 8, 9 i 10 sunt frunze.
Nodurile 5, 6 i 7 sunt frai.

,
_


0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 0
a
2. Reprezentare prin liste de descendeni
Nodul Liste de descendeni
1
2
3
4
5
6
7
8
9
10
2 , 3 , 4
5 , 6 , 7
8
9 , 10
3. Vector de tai memoreaz pentru fiecare nod printele acestuia. Pentru rdcin
elementul corespunztor din vector este egal cu 0.
T = ( 0 , 1 , 1 , 1 , 3 , 3 , 3 , 4 , 7 , 7 )
Arborii pot fi parcuri prin metode specifice grafurilor: n adncime, lime.
Arbori binari
Definiie. Un arbore n care fiecare nod are maxim doi descendeni se numete
arbore binar.
Dac aceti descendeni exist ei se numesc descendent stng, respectiv descendent
drept.
Definiie: Se numete arbore binar complet un arbore binar n fiecare nod, care nu este
frunz, are exact doi descendeni.
Propoziie: Un arbore binar complet care are p noduri terminale, toate situate pe acelai
nivel, are n total 2p-1 noduri.
Arborii binari pot fi parcuri prin metode specifice grafurilor: n adncime,
lime.
Metode specifice arborilor binari :
Parcurgerea n preordine (rdcin- stnga dreapta RSD)
Pas1. se viziteaz rdcina;
1
2 3
4 5 6 7
8

Pas2. se traverseaz subarborele stng;
Pas3. se traverseaz subarborele drept.
Parcurgerea n inordine (stnga rdcina dreapta SRD) presupune:
Pas1. se traverseaz subarborele stng;
Pas2. se viziteaz rdcina;
Pas3. se traverseaz subarborele drept.
Parcurgerea in postordine (stnga dreapta rdcin SDV)
Pas1. se traverseaz subarborele stng;
Pas2. se traverseaz subarborele drept;
Pas3. se viziteaz rdcina.
Exemplu.
Soluiile de parcurgere ale arborelui din figura urmtoare :
Parcurgerea SRD ( n inordine )
4 2 5 1 6 3 7 8
Parcurgerea RSD ( n preordine )
1 2 4 5 3 6 7 8
Parcurgere SDR ( n postordine )
4 5 2 6 8 7 3 1
10.3.2. Itemi cu alegere multipl
1. Care este nlimea i care sunt frunzele arborelui descris prin vectorul de tai: (0,
1, 1, 2, 2, 5, 3, 3)?
a) nlimea 3 i frunze: 4, 5, 6 b) nlimea 4 i frunze: 4, 6, 7, 8
c) nlimea 4 i frunze: 4, 5, 6 d) nlimea 3 i frunze: 4, 6, 7, 8
2. Cte frunze are arborele descris prin urmtorul vector de tai: (0, 1, 2, 2, 4, 1, 6, 6,
8, 8)?
a) 4 b) 6 c) 5 d) 3
3. Numrul de noduri ale unui arbore cu 14 muchii este:
a) 10 b) 14 c) 13 d) 15
4. Pentru arborele avnd urmtorul vector de tai (2, 3, 0, 1, 1, 2, 4, 5) care este
rdcina i care sunt descendenii direci ai nodului 2?
a) rd: 3 i descendenii direci: 1, 6 b) rd: 3 i descendenii direci: 2, 6
c) rd: 1 i descendenii direci: 4, 6 d) rd: 2 i descendenii direci: 1, 6
5. Care este vectorul de tai pentru arborele din figur?
a) (0, 1, 2, 3, 1, 1, 5, 7, 8, 8)
b) (0, 1, 2, 1, 3, 1, 5, 7, 8, 8)
c) (0, 1, 2, 3, 1, 1, 5, 7, 8, 7)
d) (0, 1, 2, 3, 1, 3, 5, 7, 7, 8)
0 1 1 0 0 0 0 0
0 0 0 1 1 0 0 0
0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0

6. Care sunt nodurile care au exact 2 descendeni pentru un arbore cu 9 noduri,
numerotate de la 1 la 9, dat de vectorul de tai: (5, 1, 1, 5, 0, 4, 4, 7, 7)?
a) 1,2,3 b) 1,4,5 c) 1,4,5,7 d) 2,4,5,7
7. Cte noduri trebuie eliminate dintr-un graf complet cu 15 noduri, pentru ca acesta s
devin arbore?
a) 120 b) 106 c) 116 d) 14
8. Se d un arbore cu 9 noduri etichetate cu numere de la 1 la 9 prin intermediul
vectorului de tai: (5, 0, 2, 7, 3, 3, 2, 4, 7)?
a) 7 b) 5 c) 8 d) 6
9. Se consider arborele cu 7 noduri i muchiile (1,5), (1,2), (2,3), (3,4), (3,6), (1,7).
Care dintre nodurile arborelui ar putea fi alese ca rdcin pentru ca arborele s aib
numr maxim de niveluri?
a) 1,4,5,6 b) 4,5,6,7 c) 1,6,7 d) 1,2
10. Se consider vectorul de tai al unui arbore oarecare t=(0, 1, 1, 2, 2, 3, 3, 7), n
care nodurile sunt numerotate de la 1 la 8. Alegei afirmaia incorect:
a) nodurile 4,5 sunt frai b) nodul 3 are gradul 2
c) nodul 3 este tatl lui 1 d) nodurile 4,5,6,8 sunt frunze
11. Se consider arborele cu 9 noduri i muchiile (1,5), (1,2), (2,3), (3,4), (3,6), (1,7),
(7,8), (5,9). Dac alegem ca rdcin nodul 2 , atunci vectorul corespunztor de tai al
arborelui este:
e) (2, 0, 2, 3, 1, 1, 5, 7, 8)
f) (2, 0, 2, 1, 3, 1, 3, 7, 8)
g) (2, 0, 2, 3, 1, 3, 1, 7, 5)
h) (1, 0, 2, 3, 1, 3, 5, 7, 7)
12. Se consider vectorul de tai al unui arbore oarecare t=(0, 1, 1, 2, 2, 3, 3, 7), n
care nodurile sunt numerotate de la 1 la 8. Alegei afirmaia corect:
a) nodurile 2,4,6 sunt frai b) nodul 5 are gradul 3
c) nodul 3 este tatl lui 1 d) nodurile 4,5,6,8 sunt frunze
13. Precizai cte muchii trebuie nlturate din graful a crui
matrice de adiacen este dat alturat, astfel nct s devin
arbore?
a) 1 b) 2 c)0 d) 3
14. Fie G un graf conex cu 50 de noduri si 1500 muchii. Numrul de muchii care
trebuie eliminate din G astfel nct acesta s devin arbore este:
a) 1451 b) 49 c) 1450 d) 100

15. Se consider un graf. Care din urmtoarle afirmaii este adevrat?
a) are un nod izolat b) nodurile au grad impar
c) este aciclic d) are 3 componente conexe
10.3.3. Probleme rezolvate
1. Se citete un graf prin intermediul matricei de adiacen. S se scrie un program care
verific dac este arbore.
Exemplu:
n=5 i matricea de adiacen 0 1 0 1 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0 se va afia ARBORE
Rezolvare
#include <iostream.h>
int s[20],a[20][20], b,n,i, suma;
void df(int nod)
{
int k;
s[nod]=1;
for(k=1;k<=n;k++)
if (a[nod][k]==1) {
a[k][nod]=0;
if(s[k]==0) df(k);
else b=1;
}
}
void main()
{
cin>>n;
for(i=1;i<=n;i++)
for (int j=1;j<=n;j++)
cin>>a[i][j];
df(1);
suma=0;
for(i=1;i<=n;i++)
suma=suma+s[i];
if (suma!=n)
cout<<"Nu este conex"<<endl;
else if(b) cout<<"Are cicluri"<<endl;
else cout<<"Arbore"<<endl;
}
2. Se d un graf conex. S se afieze un graf parial al su care este arbore.
Exemplu:
n=5 i matricea de adiacen 0 1 1 0 0

1 0 1 1 1
1 1 0 1 1
0 1 1 0 1
0 1 1 1 0 se va afia 1 2
2 3
3 4
4 5
Rezolvare
#include<iostream.h>
int s[20],a[20][20],n;
void df(int nod)
{
int k;
s[nod]=1;
for(k=1;k<=n;k++)
if (a[nod][k]==1 && s[k]==0)
{ cout<<nod<<" "<<k<<endl;
df(k);
}
}
void main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
df(1);
}
3. Se d un arbore pentru care se cunoate rdcina. S se scrie un program care
afieaz pentru fiecare nod nivelul pe care se afl.
Exemplu:
Rezolvare:
#include<iostream.h>
int n, c[20],s[20],ic=1,sc=1,a[20][20], i, niv[20], rad;
void bf(int nod)
{c[ic]=nod;
s[nod]=1;
while(ic<=sc) {
i=1;


4
1
2
6
3
5 7
10 9
8
Niv 1
Niv 2
Niv 3
Niv 4

while (i<=n)
{
if(a[c[ic]][i]==1 && s[i]==0)
{ sc++;
c[sc]=i;
s[i]=1;
niv[c[sc]]=niv[c[ic]]+1;
}
i++;
}
ic++;
}
}
void main()
{
cin>>n;
for (i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
cout<<"Radacina este ";
cin>>rad;
bf(rad);
for(i=1;i<=n;i++)
cout <<"Nodul "<<i<<" nivelul "<<niv[i]<<endl;
}
4. Algoritmul lui Kruskal
Fie G=(X,U) un graf neorientat, conex. Fiecare muchie are asociat un cost. Se cere
un arbore parial al lui G, astfel nct suma costului muchiilor sale s fie minim.
Un astfel de arbore se numete arbore parial de cost minim.
Arborele parial de cost minim poate fi construit muchie, cu muchie, dupa
urmtoarea metoda a lui Kruskal (1956):
Iniial, fiecare nod va constitui un arbore, deci vom avea n arbori. Apoi,
se execut de n-1 ori pasul urmtor
Se caut muchia de cost minim care unete arbori care aparin la doi arbori
diferii. Se selecteaz muchia respectiv.
Exemplu:
Ordonm cresctor (n funcie de cost) muchiile grafului: {1, 2}, {2, 3}, {4, 5},
{6, 7}, {1, 4}, {2, 5}, {4, 7}, {3, 5}, {2, 4}, {3, 6}, {5, 7}, {5, 6} i apoi aplicm
algoritmul. Structura componentelor conexe este ilustrat, pentru fiecare pas, n tabelul
1.

Figura Un graf si arborele su parial de cost minim.
Pasul Muchia considerat Componentele conexe ale
subgrafului <V, A>
iniializare {1}, {2}, {3}, {4}, {5}, {6}, {7}
1 {1, 2} {1, 2}, {3}, {4}, {5}, {6}, {7}
2 {2, 3} {1, 2, 3}, {4}, {5}, {6}, {7}
3 {4, 5} {1, 2, 3}, {4, 5}, {6}, {7}
4 {6, 7} {1, 2, 3}, {4, 5}, {6, 7}
5 {1, 4} {1, 2, 3, 4, 5}, {6, 7}
6 {2, 5} respinsa (formeaza ciclu)
7 {4, 7} {1, 2, 3, 4, 5, 6, 7}
Algoritmul lui Kruskal aplicat grafului din Figura
a.
Mulimea A este iniial vid i se completeaz pe parcurs cu muchii acceptate (care
nu formeaz un ciclu cu muchiile deja existente n A). n final, mulimea A va conine
muchiile {1, 2}, {2, 3}, {4, 5}, {6, 7}, {1, 4}, {4, 7}. La fiecare pas, graful parial
<V, A> formeaz o pdure de componente conexe, obinut din pdurea precedent
unind dou componente. Fiecare component conex este la rndul ei un arbore parial
de cost minim pentru vrfurile pe care le conecteaz. La sfrit, vom avea o singur
component conex, care este arborele parial de cost minim cautat (Figura b).
Rezolvare:
#include <iostream.h>
struct muchie{int x,y,z;}v[20];
int n,m,d[20],s[20];
void ordonare(int m)
{int i,a=0,q,w,e;
while (a==0)
{a=1;
for (i=1;i<m;i++)
if (v[i].z>v[i+1].z)
{q=v[i+1].x;w=v[i+1].y;e=v[i+1].z;
v[i+1].x=v[i].x;v[i+1].y=v[i].y;v[i+1].z=v[i].z;
v[i].x=q;v[i].y=w;v[i].z=e;
a=0;}}

void main()
{int i
cin>>n>>m;
for (i=1;i<=m;i++)
cin>>v[i].x>>v[i].y>>v[i].z;
for (i=1;i<=n;i++) d[i]=i;
for (i=1;i<=m;i++)
if (d[v[i].x]!=d[v[i].y]) {if (v[i].x<v[i].y) d[v[i].y]=d[v[i].x];s[i]=1;}
for (i=1;i<=m;i++)
if(s[i]==1) cout<<v[i].x<<" "<<v[i].y<<endl;}
10.3.4. Probleme propuse
1. Se d un graf conex. Se cere mprirea acestuia n m arbori pariali de cost minim
fiecare cu p vrfuri.S se afieze aceti arbori.
2. S se creeze un arbore binar care are drept chei numere ntregi citite de la tastatur.
S se afieze produsul cheilor impare din arbore.
3. S se creeze un arbore binar care are drept chei numere ntregi citite de la tastatur.
S se afieze produsul cheilor pozitive i numrul cheilor negative din arbore.
4. S se creeze un arbore binar care are drept chei numere ntregi citite de la tastatur.
S se afieze nodurile din arbore care au exact doi succesori.
5. S se scrie un program care afieaz cheile nodurilor unui arbore aflate pe un anumit
nivel k citit de la tastatur.
6. S se scrie un program care afieaz parcurgerea n preordine, inordine i postordine
a unui arbore binar.
7. S se scrie un program care afieaz elementul de pe poziia k, unde k este citit de la
tastatur, din parcurgerea n preordine, inordine i postordine a unui arbore binar.
8. Se d un vector x cu n componente numere ntregi reprezentnd parcurgerea n
preordine a unui arbore binar. S se creeze arborele i s se calculeze suma cheilor
numere prime din nodurile arborelui.
9. S se scrie un program care construiete un arbore binar cu cheile nodurilor numere
ntregi. Se dau dou numere a i b i se cere ca programul s verifice dac ele se afl n
arbore, iar n caz afirmativ s se verifice dac b este descendent al lui a.
10. S se creeze un arbore binar care are drept chei numere ntregi citite de la tastatur.
S se afieze nodurile din arbore care au unul din succesori cu cheia numr par.
11. Se d un arbore ale crui chei sunt numere ntregi, nu neaprat distincte. S se
afieze cheile distincte ale arborelui i numrul acestora.

12. Se d un arbore binar ale crui chei sunt numere ntregi. S se afieze suma cheilor
pare aflate pe poziii impare la parcurgerea n inordine a arborelui.
13. Se d un arbore binar ale crui chei sunt numere ntregi. S se afieze cheile
divizibile cu primul i ultimul element din parcurgerea n postordine a arborelui.
14. Se d un arbore binar ale crui chei sunt numere ntregi. S se afieze numrul de
noduri a cror cheie este egal cu o valoare k citit de la tastatur i nivelul pe care
acestea se afl.
15. Se d un arbore binar ale crui chei sunt numere ntregi. S se afieze numrul de
noduri terminale a cror cheie este egal cu o valoare k citit de la tastatur i nivelul pe
care acestea se afl este numr impar.

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