Вы находитесь на странице: 1из 54

1

GRAFURI NEORIENTATE

1. Noiunea de graf neorientat

Definiie. S Se e n nu um me e t te e g gr ra af f n ne eo or ri ie en nt ta at t o o p pe er re ec ch he e o or rd do on na at t d de e m mu ul l i im mi i n no ot ta at t G G= =( (V V, , M M) ) u un nd de e: :
V V : : e es st te e o o m mu ul l i im me e f fi in ni it t i i n ne ev vi id d , , a al le e c c r re ei i e el le em me en nt te e s se e n nu um me es sc c n no od du ur ri i s sa au u v v r rf fu ur ri i; ;
M M : : e es st te e o o m mu ul l i im me e, , d de e p pe er re ec ch hi i n ne eo or rd do on na at te e d de e e el le em me en nt te e d di is st ti in nc ct te e d di in n V V, , a al le e c c r re ei i e el le em me en nt te e s se e n nu um me es sc c
m mu uc ch hi ii i. .
Exemplu de graf neorientat:
G=(V, M) unde: V={1,2,3,4}
M={{1,2}, {2,3},{1,4}t}
Demonstraie:
Perechea G este graf neorientat deoarece respect definiia prezentat mai sus, adic:
V : este finit i nevid;
M : este o mulime de perechi neordonate (submulimi cu dou elemente) de elemente din V.

n continuare, vom nota submulimea {x,y}, care reprezint o muchie, cu [x,y] (ntr-un graf neorientat
muchia [x,y] este aceeai cu muchia [y,x]). n baza celor spuse anterior, graful prezentat n exemplul de
mai sus se reprezint textual astfel:
G=(V, M) unde: V={1,2,3,4}
M={[1,2],[2,3],[1,4]}

n teoria grafurilor neorientate, se ntlnesc frecvent noiunile:
- extremitile unei muchii
fiind data muchia m=[x,y], se numesc extremiti ale sale nodurile x i y;
- vrfuri adiacente
dac ntr-un graf exist muchia m=[x,y], se spune despre nodurile x i y ca sunt adiacente;
- inciden
dac ml i m2 sunt dou muchii ale aceluiai graf, se numesc incidente dac au o extremitate
comun.
Exemplu: m 1=[x,y] i m2=[y,z] sunt incidente
dac m=[x,y] este o muchie ntr-un graf, se spune despre ca i nodul x, sau nodul y, ca sunt
incidente.
Reprezentarea unui graf neorientat admite dou forme, i anume:
- reprezentare textual: aa cum s-a reprezentat graful din exemplul anterior;
- reprezentare grafic : muchiile sunt reprezentate prin linii,
iar nodurile prin puncte.
Exemplu de graf neorientat reprezentat textual:
G=(V, M) unde: V={ 1,2,3,4]
M={[ l,2], [2,3], [1,4]}
Exemplu de graf neorientat reprezentat grafic (este graful de la exemplul anterior):


2. Noiunea de graf parial

Definiie. F Fi ie e G G= =( (V V, , M M) ) un un g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e g gr ra af f p pa ar r i ia al l, , a al l g gr ra af fu ul lu ui i G G, , g gr ra af fu ul l n ne eo or ri ie en nt ta at t
G G
1 1= =( (V V, , M M
1 1) ) u un nd de e M M
1 1
M M. .
Concluzie:
Un graf parial al unui graf neorientat G=(V, M) are aceeai mulime de vrfuri ca i G iar mulimea
muchiilor este o submulime a lui M sau chiar M.
Exemplu: Fie graful neorientat:
1
2
G=(V, M) unde: V={ 1,2,3,4}
M={[1,2], [1,4], [2,3]}
reprezentat grafic astfel:


1. Un exemplu de graf parial al grafului G este graful neorientat:
G
1
=(V, M,) unde: V={1,2,3,4}
M
1
={[1,2],[1,4]} (s-a eliminat muchia [2,3])
reprezentat grafic astfel:

3
2. Un exemplu de graf parial al grafului G este graful neorientat:
G
1
=(V,M
1
) unde: V={1,2,3,4}
M
1
= (s-au eliminat toate muchiile)
reprezentat grafic astfel:
1
4
2
3
Observaie. Fie G=(V, M) un graf neorientat. Un graf parial, al grafului G, se obine pstrnd vrfurile i
eliminnd eventual nite muchii (se pot elimina i toate muchiile, sau chiar nici una).

3. Noiunea de subgraf

Definiie. F Fi ie e G G= =( (V V, , M M) ) un un g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e s su ub bg gr ra af f a al l g gr ra af fu ul lu ui i G G, , g gr ra af fu ul l n ne eo or ri ie en nt ta at t G G
1 1= =( (V V
1 1, ,
M M
1 1) ) u un nd de e V V
1 1
V V i ia ar r M M, , c co on n i in ne e t to oa at te e m mu uc ch hi ii il le e d di in n M M c ca ar re e a au u e ex xt tr re em mi it t i il le e n n V V
1 1. .
Exemplu: Fie graful neorientat:
G=(V, M) unde: V={ 1,2,3,4}
M={[1,2], [2,3], [1,4]}
reprezentat grafic astfel:


1. Un exemplu de subgraf al grafului G este graful neorientat:
G
1
=(V
1
, M
1
) unde: V
1
={1,2,3 } ( s-a ters nodul 4)
M
1
=([1,2],[2,3]} (s-a eliminat muchia [1,4J)




reprezentat grafic astfel:
1


2. Un exemplu de subgraf al grafului G este graful neorientat:
G
1
=(V
1
,M
1
) unde: V
1
={1,2,3,4}
(s-a eliminat nodul 1)
M
1
={[2,3]}(s-au eliminat muchiile [1,4], [1,2])

reprezentat grafic astfel:
4


1
1
3

Observaie. Fie G=(V, VI) un graf neorientat. Un subgraf, al grafului G, se obine tergnd anumite
vrfuri i odat cu acestea i muchiile care le admit ca extremitate.
4. Gradul unui vrf

Definiie. F Fi ie e G G= =( (V V, , M M) ) un un g gr ra af f n ne eo or ri ie en nt ta at t i i x x un un n no od d a al l s s u u. . S Se e n nu um me e t te e g gr ra ad d a al l n no od du ul lu ui i x x, , n nu um m r ru ul l
m mu uc ch hi ii il lo or r i in nc ci id de en nt te e c cu u x x, , n no ot ta at t d d( (x x) ). .
Exemplu: Fie graful neorientat:
G=(V, M) unde: V= {1,2,3,4}
M={[l,2], [2,3], [1,4], [1,3]}





reprezentat grafic astfel:


3
Gradul nodului 1 este d(1) i d(1)=3 (n graf sunt trei muchii incidente cu 1 )
Gradul nodului 2 este d(2) i d(2)=2 (n graf sunt dou muchii incidente cu 2 )
Gradul nodului 3 este d(3) i d(3)=2 (n graf sunt dou muchii incidente cu 3)
Gradul nodului 4 este d(4) i d(4)=1 (n graf este o singur muchie incident cu 4)
Observaii.
1. Dac gradul unui vrf este 0, vrful respectiv se numete vrf izolat.
2. Dac gradul unui vrf este l, vrful respectiv se numete vrf terminal.
n graful care admite reprezentarea grafic:
1


deoarece d(1)=0, vrful 1 se numete vrf izolat, i
deoarece d(2)=d(3)=1, vrfurile 2 i 3 se numesc vrfuri terminale.

Propoziie. . n n g gr ra af fu ul l n ne eo or ri ie en nt ta at t G G= =( (V V, , M M) ), , i in n c ca ar re e V V= ={ {x x
1 1, , x x
2 2, , . .. .. ., , x x
n n} } i i s su un nt t m m m mu uc ch hi ii i, , s se e v ve er ri if fi ic c
e eg ga al li it ta at te ea a : : m x d
n
i
i
2 ) (
1
=

=

Demonstraie:
Muchia [x,y] contribuie cu o unitate la gradul lui x i cu o unitate la gradul lui y, deci, cu dou uniti la
suma din enun. Cum n total sunt m muchii, rezult c suma gradelor este 2m.

Avnd in vedere faptul ca suma gradelor vrfurilor dintr-un graf este un numr par (2m), a aprut
corolarul prezentat mai jos.
Corolar. n n o or ri ic ce e g gr ra af f n ne eo or ri ie en nt ta at t, , G G= =( (V V, , M M) ), , e ex xi is st t un un n nu um m r r p pa ar r d de e v v r rf fu ur ri i d de e g gr ra ad d i im mp pa ar r. .
Demonstratie:
Demonstraia ine cont de propoziia de mai sus, adic de faptul c ntr-un graf neorientat suma S a
tuturor gradelor nodurilor este un numr par (dublul numrului muchiilor).
Fie S1 suma gradelor vrfurilor de grad par, (este un numr par, ca sum de numere pare) i S2 suma
gradelor vrfurilor de grad impar.
Cum S=S1+S2, rezult c S2=S-S1, deci un numr par (ca diferen de numere pare).

5. Graf complet

Definiie. F Fi ie e G G= =( (V V, , M M) ) un un g gr ra af f n ne eo or ri ie en nt ta at t. . G Gr ra af fu ul l G G s se e n nu um me e t te e g gr ra af f c co om mp pl le et t, , d da ac c o or ri ic ca ar re e d do ou u
v v r rf fu ur ri i d di is st ti in nc ct te e a al le e s sa al le e s su un nt t a ad di ia ac ce en nt te e. .
Exemplu de graf neorientat complet:
G=(V, M) unde: V={ 1,2,3,4}
M={[1,2], [1,3], [l,4], [2,3], [2,4], [3,4]}
Reprezentarea sa grafic este:
1
1
4

Observaii.
1. ntr-un graf complet cu n vrfuri gradul fiecrui vrf este n-1, deoarece fiecare vrf este legat prin
muchii de toate celelalte vrfuri.
2. Graful complet cu n vrfuri se noteaz cu K
n

n particular, graful:

se noteaz K
4
(este un graf complet cu 4 vrfuri).
Propoziie. n nt tr r- -u un n g gr ra af f c co om mp pl le et t c cu u n n v v r rf fu ur ri i, , n no ot ta at t K K
n n, , e ex xi is st t
( )
2
1 n n
m mu uc ch hi ii i. .
Demonstraie:
Din fiecare vrf x, pleac n-1 muchii, deci d(x
i
)=n-1, pentru orice i= 1..n Cum folosind propoziia
prezentat n seciunea gradul unui vrf.
2m= d(x
1
)+ d(x
2
)+ ... +d(x
n
) 2m=(n-1)+ (n-1)+... +(n-1)
2m=n(n-1)/2

6. Graf bipartit

Definiie. F Fi ie e G G = =( (V V, , M M) ) un un g gr ra af f n ne eo or ri ie en nt ta at t. . G Gr ra at tu ul l G G s se e n nu um me e t te e g gr ra af f b bi ip pa ar rt ti it t, , d da ac c e ex xi is st t d do ou u m mu ul l i im mi i
n ne ev vi id de e V Vl l i i V V2 2 c cu u p pr ro op pr ri ie et t i il le e: :
=
=
2 1
2 1
V V
V V V

- - o or ri ic ce e m mu uc ch hi ie e a a l lu ui i C C a ar re e o o e ex xt tr re em mi it ta at te e n n V V1 1 i i p pe e c ce ea al la al lt t n n V V2 2. .
Exemplu de graf neorientat bipartit:
G=(V, M) unde: V={ 1,2,3,4}
M={[1,3], [2,3], [2,4]}
Reprezentarea sa grafic este:
1


3

Demonstraie:
Graful de mai sus este bipartit deoarece respect ntocmai definiia grafului bipartit, adic exist dou
mulimi V1={1,2} i V2={3,4} astfel nct:
=
=
2 1
2 1
V V
V V V

- orice muchie a lui C are o extremitate n V1 i pe cealalt n V2. .
Cum, n plus, pentru orice x din V1 i orice y din V2 exist n G muchia [x,y], rezult, conform definiiei,
ca graful G este bipartit complet.
Observaie. A demonstra c un graf au este bipartit complet nseamn a demonstra :
- c este bipartit
- pentru orice x din Vl i orice y din V2 exist in G muchia [x,y].
Observaie. ntr-un graf bipartit complet n care V1 are p elemente i V2 are q elemente exist pq muchii.
Demonstraie:
3
5
Fiecare vrf x
i
din V1 este legat de toate vrfurile aflate n V2, altfel spus, exist q muchii care-l admit ca
extremitate pe x
i
. Cum n Vl sunt p elemente, adic i= 1...p. nseamn c elementele mulimii V1 sunt
legate prin pq muchii de elementele mulimii V2.
Observaie. Graful bipartit complet n care V1 are p elemente i V2 are q elemente se noteaz cu K
p,q
.
n particular, graful:

se noteaz K
2,2
(este un graf bipartit complet cu
V1 = 2 i V2=2 , V1 i V2 din definiie).

8. Reprezentarea grafurilor neorientate

Fie G=(V, M) un graf neorientat, unde V={x
1
, x
2
,..., x
n
} i M={m
1
,m
2
,..., m
p
}. Deoarece ntre mulimea
{x
1
, x
2
,..., x
n
} i mulimea {1, 2,..., n} exist o bijecie, x
i
i, putem presupune, fr a restrnge
generalitatea, mai ales pentru a uura scrierea, ca V={ 1, 2,..., n}.
n baza celor spuse mai sus, mai departe, ]n loc de x; vom scrie i i ]n loc de muchia [x
i
,x
j
] vom scrie [i,j].
Pentru a putea prelucra un graf neorientat cu ajutorul unui program, trebuie mai nti s fie reprezentat in
programul respectiv.
Pentru a reprezenta un graf, ntr-un program, exist mai multe modaliti folosind diverse structuri de
date; dintre acesta, in continuare, vom prezenta:
- reprezentarea unui graf prin matricea de adiacen;
- reprezentarea unui graf prin listele de adiacen;
- reprezentarea unui graf prin irul muchiilor.

Matricea de adiacent

Fie G=(V, M) un graf neorieritat cu n vrfuri (V={1,2, ..., n}) i m muchii.
M Ma at tr ri ic ce ea a d de e a ad di ia ac ce en n , , a as so oc ci ia at t g gr ra af fu ul lu ui i G G, , e es st te e o o m ma at tr ri ic ce e p p t tr ra at ti ic c d de e o or rd di in nu ul l n n, , c cu u e el le em me en nt te el le e d de ef fi in ni it te e
a as st tf fe el l: :
[ ]
[ ]

=
M j i daca
M j i daca
a
j i
, , 0
, , 1
,

( (a al lt tf fe el l s sp pu us s, , a a
i i, ,j j= =1 1, , d da ac c e ex xi is st t m mu uc ch hi ie e n nt tr re e i i i i j j i i a a
i i, ,j j= =0 0 d da ac c n nu u e ex xi is st t m mu uc ch hi ie e n nt tr re e i i i i j j) )
Exemplul 1. Fie graful reprezentat grafic ca in
figura de mai jos:

Matricea de adiacen, asociat grafului, este:
|
|
|
|
|

\
|
=
|
|
|
|
|

\
|
=
0 0 1 1
0 0 1 1
1 1 0 0
1 1 0 0
44 43 42 41
34 33 32 31
24 23 22 21
14 13 12 11
a a a a
a a a a
a a a a
a a a a
A

Exemplul 2. Fie graful reprezentat grafic ca in
figura de mai jos:

Matricea de adiacent, asociat grafului, este:
|
|
|
|
|

\
|
=
|
|
|
|
|

\
|
=
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
44 43 42 41
34 33 32 31
24 23 22 21
14 13 12 11
a a a a
a a a a
a a a a
a a a a
A
Comentarii:
1. Matricea de adiacen este o matrice ptratic, de ordin n, i simetric fa de diagonala principal
(adic a[i][j]=a[j][i]).
Secvenele de citire a matricei de adiacen, sunt:
int a[100][100];
..........
cout<<"n="; cin>>n;
for (i=1;i<=n-l;i++) se citesc valorile elementelor
for (j=i+l;j<=n;j++) de deasupra diagonalei
principale
{ cin>>a[i][j]; i se transfer i sub
a[j][i]=a[i][j];} diagonala principal
1
3
6



sau:
.......
cin>>n; cin>>m;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
a[i][j]=0;
for (i=1;i<=m;i++)
{cout<<"dati extremitatile muchiei "<<i;
cin>>x >>y;
a[x][y]=1; a[y][x]= 1;}
2. Matricea de adiacent are toate elementele de pe diagonala principal egale cu 0.
3. Numrul elementelor egale cu 1 de pe linia i (sau coloana i) este egal cu gradul vrfului i. Dac
vrful i este un vrf izolat pe linia i (i coloana i) nu sunt elemente egale cu 1.

Liste de adiacen

Fie G=(V, M) un graf neorientat cu n vrfuri (V={1,2, ..., n}) i m muchii.

R Re ep pr re ez ze en nt ta ar re ea a g gr ra af fu ul lu ui i G G p pr ri in n l li is st te e d de e a ad di ia ac ce en n c co on ns st t n n: :
- - p pr re ec ci iz za ar re ea a n nu um m r ru ul lu ui i d de e v v r rf fu ur ri i, , n n; ;
- - p pe en nt tr ru u f fi ie ec ca ar re e v v r rf f i i, , s se e p pr re ec ci iz ze ea az z l li is st ta a L L
i i a a v ve ec ci in ni il lo or r s s i i, , a ad di ic c l li is st ta a n no od du ur ri il lo or r a ad di ia ac ce en nt te e c cu u n no od du ul l i i. .
Exemplul 1. Fie graful reprezentat grafic ca in
figura de mai jos:

Reprezentarea sa prin liste de adiacene presupune:
- precizarea numrului de vrfuri n, n=4;
- precizarea listei vecinilor lui i, pentru i=1..n,
astfel:
Vrful i Lista vecinilor lui i
1 3,4
2 3,4
3 1,2
4 1,2

Exempul 2. Fie graful reprezentat grafic ca in
figura de mai jos:

Reprezentarea sa prin liste de adiacene presupune:
- precizarea numrului de vrfuri n, n=4;
- precizarea listei vecinilor lui i, pentru i= 1..n,
astfel:
Vrful i Lista vecinilor lui i
1 2,3,4
2 1,3,4
3 1,2,4
4 1,2,3
Comentarii:
Acest mod de reprezentare se poate implementa astfel:
l l. . S Se e f fo ol lo os se e t te e un un t ta ab bl lo ou u b bi id di im me en ns si io on na al l T T, , c ca ar ra ac ct te er ri iz za at t a as st tf fe el l: :
a ar re e n n + +2 2m m c co ol lo oa an ne e; ;
T T
1 1, ,i i= =i i p pe en nt tr ru u i i= =1 1. .. .n n; ;
P Pe en nt tr ru u i i= =1 1. .. .n n T T
2 2, , i i= =k k, , d da ac c T T
1 1, ,k k e es st te e p pr ri im mu ul l n no od d d di in n l li is st ta a v ve ec ci in ni il lo or r l lu ui i i i; ;
T T
2 2, ,i i= =0 0, , d da ac c n no od du ul l i i e es st te e i iz zo ol la at t; ;
D Da ac c T T
1 1, ,j j= =u u, , a ad di ic c u u e es st te e un un n no od d d di in n l li is st ta a v ve ec ci in ni il lo or r l lu ui i i i, , a at tu un nc ci i: :
T T
2 2, ,j j= =0 0, , d da ac c u u e es st te e u ul lt ti im mu ul l n no od d d di in n l li is st ta a v ve ec ci in ni il lo or r l lu ui i i i; ;
T T
2 2, ,j j= =j j+ +l l, , d da ac c u u n nu u e es st te e u ul lt ti im mu ul l n no od d d di in n l li is st ta a v ve ec ci in ni il lo or r l lu ui i i i. .
Exemplu de completare a tabloului pentru graful de la exemplul 1
Prima etap. Se numeroteaz coloanele ( l ..n+2m) i se trec vrfurile.
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4

A doua etap. Se trec in tabel vecinii lui 1, ncepnd de la coloana 5.
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 3 4
5 6 0
T
2,1
=5, pentru ca primul vecin (3) al lui 1 s-a trecut la coloana 5 (T
1,5
=3).
T
2,5
=6, pentru c urmtorul vecin (4) al lui l s-a trecut la coloana 6 (T
1,6
=4).
1
1
7
T
2,6
=0, pentru ca vecinul T
1,6
(4) al lui 1 este ultimul din list.
A treia etap. Se trec in tabel vecinii lui 2, ncepnd de la coloana 7.
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 3 4 3 4
5 7 6 0 8 0
T
2,2
=7, pentru c primul vecin (3) al lui 2 s-a trecut la coloana (T
1,7
=3).
T
2,7
=8, pentru ca urmtorul vecin (4) al lui 2 s-a trecut la coloana 8 (T
1,8
=4).
T
2,8
=0, pentru c vecinul T
1,8
(4) al lui 2 este ultimul din list.
A patra etap. Se trec in tabel vecinii lui 3, ncepnd de la coloana 9.
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 3 4 3 4 1 2
5 7 9 6 0 8 0 10 0
T
2,3
=9, pentru c primul vecin (1) al lui 3 s-a trecut la coloana 9 (T
1,9
=1).
T
2,9
=10, pentru c urmtorul vecin (2) al lui 3 s-a trecut la coloana 10 (T
1,10
=2)
T
2,10
= 0, pentru c vecinul T
1,10
(2) al lui 3 este ultimul din list.
Ultima etap. Se trec in tabel vecinii lui 4, ncepnd de la coloana 11.
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 3 4 3 4 1 2 1 2
5 7 9 11 6 0 8 0 10 0 12 0
T
2,4
=11, pentru c primul vecin (1) al lui 4 s-a trecut la coloana 11 (T
1,11
=1).
T
2,11
=12, pentru c urmtorul vecin (2) al lui 4 s-a trecut la coloana 12 (T
1,12
=2)
T
2,12
=0, pentru c vecinul T
1,12
(2) al lui 4 este ultimul din list.

2 2. . S Se e f fo ol lo os se e t te e un un t ta ab bl lo ou u u un ni id di im me en ns si io on na al l, , c cu u n nu um me el le e c ca ap p, , i i un un t ta ab bl lo ou u b bi id di im me en ns si io on na al l, , c cu u n nu um me el le e L L
( (c ca ar re e r re e i in ne e l li is st te el le e d de e v ve ec ci in ni i p pe en nt tr ru u f fi ie ec ca ar re e n no od d) ), , c ca ar ra ac ct te er ri iz za at te e a as st tf fe el l: :
T Ta ab bl lo ou ul l c ca ap p: :
- - a ar re e n n c co om mp po on ne en nt te e; ;
- - c ca ap p
i i = =c c, , d da ac c p pr ri im mu ul l n no od d d di in n l li is st ta a v ve ec ci in ni il lo or r l lu ui i i i e es st te e t tr re ec cu ut t i in n t ta ab bl lo ou ul l L L l la a c co ol lo oa an na a c c, , a ad di ic c L L
1 1, ,c c
e es st te e p pr ri im mu ul l v ve ec ci in n a al l l lu ui i i i, ,
i i c ca ap p
i i = =0 0, , d da ac c n no od du ul l i i e es st te e i iz zo ol la at t
T Ta ab bl lo ou ul l L L: :
- - a ar re e 2 2m m c co om mp po on ne en nt te e; ;
- - d da ac c k k e es st te e un un v ve ec ci in n a al l n no od du ul lu ui i i i, , a at tu un nc ci i: :
L L
1 1, , k k= =k k i i L L
2 2, ,p p= =0 0, , d da ac c k k e es st te e u ul lt ti im mu ul l v ve ec ci in n d di in n l li is st t , , s sa au u
L L
1 1, ,p p= =k k i i L L
2 2, ,p p= = p p+ +l l d da ac c k k n nu u e es st te e u ul lt ti im mu ul l v ve ec ci in n d di in n l li is st t ( (p p e es st te e c co ol lo oa an na a l la a c ca ar re e s s- -a a a aj ju un ns s
n n t ta ab bl lo ou ul l L L) ). .
Exemplu de completare a tablourilor cap i L, pentru graful de la exemplul 1.
Tabloul cap
1 2 3 4
1 3 5 7

Tabloul L
1 2 3 4 5 6 7 8
3 4 3 4 1 2 1 2
2 0 4 0 6 0 8 0
3 3. . S Se e f fo ol lo os se e t te e un un t ta ab bl lo ou u b bi id di im me en ns si io on na al l, , c cu u n nu um me el le e L L, , c ca ar ra ac ct te er ri iz za at t a as st tf fe el l: :
- - a ar re e n n l li in ni ii i; ;
- - p pe e l li in ni ia a i i s se e t tr re ec c v ve ec ci in ni i n no od du ul lu ui i i i. .
Exemplu de completare a tabloului L, pentru graful:

8

Tabloul L
3
3 4
1 2 4
2 3
Implementarea n limbajul C++, a ideii prezentate mai sus, se realizeaz conform secvenei de
program prezentat mai jos.
.....................
int L[20][20];
int nr_vec[20];
cout<<"n=; cin>>n;
for (i=1;i<=n;i++)
{cout<<"Dati numarul veciniior nodului "<<i; cin>>nr_vec[i];
for (j=1;j<=nr_vec[i];j++)
cin>>L[i][j];}
..................
Construirea matricei de adiacen cnd se cunoate L (listele vecinilor fiecrui nod).
...............................
for (i=1;i<=n;i++)
{for (j=1;j<=nr_vec[i];j++)
a[i][L[i][j]]=1;}
.................................
Construirea tabloului L (listele vecinilor nodurilor) cnd se cunoate matricea de adiacent.
.................................
for (i=1;i<=n;i++)
{k=0;
for (j=l;j<=n;j++)
if (a[i][j]==1)
{k=k+l ;
L[i][k]=j;}
}
4 4. . S Se e f fo ol lo os se e t te e un un t ta ab bl lo ou u u un ni id di im me en ns si io on na al l, , c cu u n nu um me el le e L L, , c ca ar ra ac ct te er ri iz za at t a as st tf fe el l: :
- - c co om mp po on ne en nt te el le e s sa al le e s su un nt t d de e t ti ip p r re ef fe er ri in n ; ;
- - a ar re e n n c co om mp po on ne en nt te e; ;
- - L L
i i p po oi in nt te ea az z s sp pr re e n nc ce ep pu ut tu ul l l li is st te ei i v ve ec ci in ni il lo or r n no od du ul lu ui i i i. .

irul muchiilor

Fie G=(V, M) un graf neorientat cu n vrfuri (V={1,2,..., n}) i m muchii. Reprezentarea grafului G
const in precizarea numrului n de noduri si numrului m de muchii, precum i n precizarea
extremitilor pentru fiecare muchie n parte.
Comentarii:
Acest mod de reprezentare se implementeaz astfel:
1 1. . S Se e d d n nu um m r ru ul l n n d de e n no od du ur ri i, , n nu um m r ru ul l m m d de e m mu uc ch hi ii i i i e ex xt tr re em mi it t i il le e f fi ie ec c r re ei i m mu uc ch hi ii i, , c ca ar re e s su un nt t t tr re ec cu ut te e n n
v ve ec ct to or ri ii i e el l i i e e2 2 a as st tf fe el l: :
e ex xt tr re em mi it t i il le e p pr ri im me ei i m mu uc ch hi ii i s su un nt t e e1 1[ [i i] ] s si i e e2 2[ [1 1] ]; ;
e ex xt tr re em mi it t i il le e c ce el le ei i d de e- -a a d do ou ua a m mu uc ch hi ie e s su un nt t e el l[ [2 2] ] i i e e2 2[ [2 2] ]; ;
. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .
d de ec ci i M M= ={ { [ [e e1 1[ [1 1] ], ,e e2 2[ [1 1] ]] ] , , [ [e e1 1[ [2 2] ], ,e e2 2[ [2 2] ]] ] , ,. .. .. ., , [ [e e1 1[ [m m] ], ,e e2 2[ [m m] ]] ]} }. .
Secvena C++ corespunztoare este:
int el[100],e2[l00];
int n, m, i;
............................
cout<<"n="; cin>>n;
9
cout<<"m="; cin>>m;
for (i=1;i<=m;i++)
{cout<<"Dati extremitatile muchiei cu numarul "<<i;
cin>>e1[i]>>e2[i];}
............................

Construirea matricei de adiacen, cnd se cunoate irul muchiilor ca mai sus.
............................
cout<<"n="; cin>>n;
for (i=1;i<=m;i++)
{a[el[i]][e2[i]]=1;
a[e2[i]][el[i]]=1;}
Construirea irului muchiilor, ca mai sus, cnd se d matricea de adiacen.
.............................
k=0;
for (i=l;i<=n-l;i++)
for (j=i+1;j<=n;j++)
if (a[i][j]=1)
{k=k+1;
e1[k]=i;
e2[k]=j;}
m=k;
..............................

2 2. . S Se e f fo ol lo os se e t te e un un t ta ab bl lo ou u u un ni id di im me en ns si io on na al l, , c cu u n nu um me el le e e e, , c ca ar ra ac ct te er ri iz za at t a as st tf fe el l: :
- - c co om mp po on ne en nt te el le e s sa al le e s su un nt t d de e t ti ip p s st tr ru uc ct tu ur r ; ;
- - a ar re e m m c co om mp po on ne en nt te e; ;
- - e e
i i r re ep pr re ez zi in nt t m mu uc ch hi ia a i i. .
P Pe en nt tr ru u i im mp pl le em me en nt ta ar re e e es st te e n ne ev vo oi ie e d de e: :
t ty yp pe ed de ef f s st tr ru uc ct t{ {
i in nt t x x; ;
i in nt t y y; ;
} } m mu uc ch hi ie e; ;
m mu uc ch hi ie e e e[ [2 20 0] ]; ;
. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .
A Ac cc ce es su ul l l la a m mu uc ch hi ia a i i s se e f fa ac ce e: : e e[ [i i] ]. .x x . .. .. .. .. .. . e e[ [i i] ]. .y y
Secvena C++ corespunztoare este:
..............................
cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
for (i=1;i<;=m;i++)
{cout<<"Dati extremitatile muchiei cu numarul "<<i;
cin>>e[i].x>>e[i].y;}
Construirea matricei de adiacen, cnd se cunoate irul muchiilor ca mai sus.
...............................
cout<<"n=; cin>>n;
for (i=l;i<=m;i++)
{a[e[i].x][e[i].y]=1;
a[e[i].y][e[i].x]=1;}
..............................
Construirea irului muchiilor, ca mai sus, cnd se d matricea de adiacen.
..............................
k=0;
for (i= 1;i<=n-1;i++)
for (j=i+l;j<=n; j++)
10
if (a[i][j]==1)
{ k =k+1;
e[k].x=i;
e[k].y=j;}
m=k;
...............................

9. Parcurgerea grafurilor

Fie G=(V, M) graf neorientat, unde V={x
1
, x
2
,..., x
n
} i M={m
1
, m
2
,..., m
p
}.
Prin parcurgerea grafului G se nelege vizitarea, ntr-un mod sistematic, a tuturor nodurilor, plecnd de
la un nod pl (nod de plecare) mergnd pe muchii incidente dou cte dou.
Un graf poate fi parcurs n urmtoarele dou moduri:
- n ltime (BF = Breadth First)
- n adncime (DF = Depth First)

Parcurgerea n lime (BF- breadth first)

Fie G=(V, M) un graf neorientat cu n vrfuri (V={1,2, ..., n}) i m muchii.
A Al lg go or ri it tm mu ul l- -d de e p pa ar rc cu ur rg ge er re e a a g gr ra af fu ul lu ui i n n l l i im me e, , f fo ol lo os si in nd d o o c co oa ad d , , e es st te e: :
- - i in ni i i ia al l t to oa at te e n no od du ur ri il le e s se e c co on ns si id de er r n ne ev vi iz zi it ta at te e; ;
- - s se e c ci it te e t te e n no od du ul l d de e p pl le ec ca ar re e p pl l, , c ca ar re e s se e c co on ns si id de er r a ac cu um m v vi iz zi it ta at t, , i i s se e t tr re ec ce e i in n c co oa ad d p pe e , ,p pr ri im ma a p po oz zi i i ie e; ;
- - s se e t tr re ec c i in n c co oa ad d t to oa at te e n no od du ur ri il le e n ne ev vi iz zi it ta at te e p p n n i in n p pr re ez ze en nt t i i s su un nt t a ad di ia ac ce en nt te e c cu u n no od du ul l d de e p pl le ec ca ar re e
( (o od da at t c cu u t tr re ec ce er re ea a l lo or r i in n c co oa ad d s se e m ma ar rc ch he ea az z c ca a f fi ii in nd d v vi iz zi it ta at te e) ); ;
- - s se e t tr re ec ce e l la a u ur rm m t to or ru ul l e el le em me en nt t d di in n c co oa ad d , , c ca ar re e i ia a r ro ol lu ul l n no od du ul lu ui i d de e p pl le ec ca ar re e, , i i s se e r re ei ia a p pa as su ul l a an nt te er ri io or r; ;
. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .
- - a al lg go or ri it tm mu ul l s se e t te er rm mi in n d du up p c ce e s su un nt t p pa ar rc cu ur rs se e t to oa at te e e el le em me en nt te el le e d di in n c co oa ad d . .
Exemplul 1. Fie graful reprezentat grafic ca n figura de mai jos:
1

Observaie. n continuare, un nod se consider vizitat cnd este ncercuit:
i cu p i u notm indicele primului, respectiv ultimului element din coad.
Parcurgerea in lime, a grafului de mai sus, presupune parcurgerea etapelor:
* La nceput, nici un nod nu este vizitat (graful arat ca in figura iniial, adic nici un nod nu este
ncercuit).
* Se pleac de la nodul 1, care se trece in coad pe prima poziie i se marcheaz ca fiind vizitat.
p=u
1
*Se viziteaz i se trec n coad toate nodurile adiacente cu nodul 1, nevizitate nc (2,3,4).

11

p u
1 2 3 4
* Se trece la urmtorul element din coad; acesta este 2. Se viziteaz i se trec n coad toate nodurile
adiacente cu nodul 2, nevizitate nc (nu este nici un nod care s verifice condiiile).

p u
1 2 3 4
*Se trece la urmtorul element din coad; acesta este 3. Se viziteaz i se trec n coad toate nodurile
adiacente cu nodul 3, nevizitate nc (b).

p u
1 2 3 4 6
* Se trece la urmtorul element din coad; acesta este 4. Se viziteaz i se trec n coad toate nodurile
adiacente cu nodul 4, nevizitate nc (5).

p u
1 2 3 4 6 5
*Se trece la urmtorul element din coad: acesta este 6. Se viziteaz i se trec n coad toate nodurile
adiacente cu nodul 6, nevizitale nc (nu este nici un nod care s verifice condiiile).
p u
1 2 3 4 6 5
*Se trece la urmtorul element din coada; acesta este 5. Se viziteaz i se trec n coada toate nodurile
adiacente cu nodul 5, nevizitate nc (nu este nici un nod care s verifice condiiile).
p = u
1 2 3 4 6 5
* Algoritmul se ncheie aici (nu mai sunt noduri).
Deci, parcurgerea in lime a grafului este: 1 2 3 4 6 5

12

n continuare, vom prezenta programele C++ care implementeaz algoritmul prezentat mai sus.
Programul 1 (abordare nerecursiv)
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int a[20][20],coada[20], viz[20];
int i, n , el, j, p, u, pl, m, x, y;
void main()
{clrscr();
cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
for (i=1;i<=m;i++)
{cout<<"x y ="; cin>>x>>y;
a[x][y]=1; a[y][x]=1;}
for (i=1;i<=n;i++)
viz[i]=0;
cout<<"dati nodul de plecare :"; cin>>pl;
viz[pl]=1;
coada[1]=pl;
p=1; u=1;
while (p<=u)
{ el=coada[p];
for (j=1;j<=n;j++)
if ((a[el][j]==1) && (viz[j]==0))
{u=u+ 1;
coada[u]=j;
viz[j]=1;}
p=p+1;}
for (i=1;i<=u;i++) cout<<coada[i]<< " ";
getch();}
Programul 2 (abordare recursiv)
Comentarii la funcia parc_latime:
- are un parametru formal, i, care reprezint poziia curent la care s-a ajuns n coad;
- procedeaz astfel:
- se parcurg nodurile grafului, cu j:
dac j este adiacent cu nodul curent din coad i j este nevizitat
- se adaug la coad;
- i se marcheaz ca fiind vizitat;
- dac mai sunt elemente n coad se trece la urmtorul i se reapeleaz funcia

# include <conio.h>
#include <iostream.h>
#include <stdio.h>
int a[20][20];
int coada[20], vizitat[20];
int i, n , j, u, pl, m,x, y;
void parc_latime(int i)
{int j;
for (j=1;j<=n;j++)
if ((a[coada[i]][j]==1) && (vizitat[j]==0))
{ u=u+1;
coada[u]=j;
vizitat[j]=1 ;}
if (i<=u) parc_latime(i+1);}
13
void main()
{ clrscr();
cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
for (i=1;i<=m;i++)
{cout<<"x y" ; cin>>x>>y;
a[x][y]=1; a[y][x]=1;}
for (i=1;i<=n;i++)
viz[i]=0;
cout<<"dati nodul de plecare :"; cin>>pl;
vizitat[pl]=1;
coada[1]=pl;
u=1 ;
parc_latime(1);
for (i=1;i<=u;i++)
cout<<coada[i]<<" ";
getche(); }

Parcurgerea in adncime (DF-depth first)

Fie G =(V, M) un graf neorientat cu n vrfuri (V={1 ,2, .... n} ) i m muchii.
Algoritmul recursiv de parcurgere a grafului in adncime este implementat n funcia parc_adancime,
caracterizat astfel:
- are un parametru formal (nodul curent, asupra cruia se aplic):
- procedeaz astfel:
- afieaz nodul asupra cruia se aplic i-l marcheaz ca fiind vizitat;
- pentru fiecare vecin nevizitat de-al nodului curent
- se autoapeleaz asupra sa.
Exemplul 1. Fie graful reprezentat grafic ca n
figura de mai jos:
1
10

Aplicarea algoritmului de parcurgere n
adncime, asupra grafului de mai sus, plecnd de
la primul nod, conduce la afiarea urmtoarei
secvene:
1 2 3 4 5 6 7 8 9 10
Exemplul 2. Fie graful reprezentat grafic ca n
figura de mai jos:
l

6 9 10
Aplicarea algoritmului de parcurgere n
adncime, asupra grafului de mai sus, plecnd de
la primul nod, conduce la afiarea urmtoarei
secvene:
1 2 3 4 7 8 5 6 9 10

#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int a[20][20];
int vizitat[20];
int i,n,j,pl,m,x,y;
void parc_adancime(int pl)
{int j;
cout<<pl<<" ";
viz[pl]=1;
for (j=1; j<=n;j++)
if ((a[pl][j]==1) && (vizitat[j]==0))
parc_adancime(j);}
void main()
{cout<<"n m "; cin>>n>>m;
for (i=1;i<=m;i++)
{cout<<"x y "; cin>>x>>y;
a[x][y]=1; a[y][x]=1;}
14
for (i=1;i<=n;i++)
vizitat[i]=0;
cout<<"dati nodul de plecare :"; cin>>pl;
parc_adancime(pl);
getch();}

10. Conexitate

Vor fi prezentate noiunile:
- lan
- ciclu
- graf conex
- component conex

Lan

Definiie. F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e l la an n , , n n g gr ra af fu ul l G G, , o o s su uc cc ce es si iu un ne e d de e n no od du ur ri i, , n no ot ta at t L L
= = [ [x x
i i1 1 , , x x
i i22, , , ,. .. .. ., , x x
i ik k ] ] , , c cu u p pr ro op pr ri ie et ta at te ea a c c o or ri ic ca ar re e d do ou u n no od du ur ri i c co on ns se ec cu ut ti iv ve e s su un nt t a ad di ia ac ce en nt te e, , a al lt tf fe el l s sp pu us s
[ [x x
i i1 1, ,x x
i i22] ], ,. .. .. ., , [ [x x
i ik k- -1 1, ,x x
i ikk] ] M M
Se ntlnesc noiunile:
- extremitile lanului
fiind dat lanul L = [x
i1
, x
i2
, ,..., x
ik
], se numesc extremiti ale sale nodurile x
i1
i x
ik
( x
i1
-
extremitate iniial; x
ik
- extremitate final);
- lungimea lanului
fiind dat lanul L = [x
i1
, x
i2
, ,..., x
ik
] prin lungimea sa se nelege numrul de muchii care
apar n cadrul lui
Exemplu de lan:
Fie graful G=(V, M) unde:
V={ 1,2,3,4,5}
M={[1,3], [1,4], [2,3], [2,4], [2,5]}




cu reprezentarea grafic astfel:

Lanul L1=[1, 3, 2, 4] este n graful G lan cu lungimea 3 i extremitile 1 i 4.
L2=[5, 2, 4, 1, 3, 2] este n graful G lan cu lungimea 5 i extremitile 5 si 2.
Observaie Dac L=[x
i1
, x
i2
, ,..., x
ik
], este lan n graful G, atunci i L1= [x
ik
,...,x
i2
,x
i1
], este lan n graful
G.
Definiie. F Fi ie e G G- -( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e l la an n e el le em me en nt ta ar r, , n n g gr ra af fu ul l G G, , l la an n u ul l L L = = [ [x x
i i1 1 , , x x
i i2 2, ,
, ,. .. .. ., , x x
i ik k ] ], , c cu u p pr ro op pr ri ie et ta at te ea a c c o or ri ic ca ar re e d do ou u n no od du ur ri i a al le e s sa al le e s su un nt t d di is st ti in nc ct te e ( (a al lt tf fe el l s sp pu us s: : p pr ri in nt tr r- -u un n n no od d n nu u s se e
t tr re ec ce e d de ec c t t o o s si in ng gu ur r d da at t ) ). .
Exemplu: n graful

lanul L1=[l, 3, 2, 4] este lan elementar.
Definiie. F Fi ie e G G= =( (V V, ,M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e l la an n n ne ee el le em me en nt ta ar r n n g gr ra af fu ul l G G l la an n u ul l L L= =[ [x x
i i1 1 , , x x
i i2 2, ,
, ,. .. .. ., , x x
i ik k ] ], , c cu u p pr ro op pr ri ie et ta at te ea a c c n no od du ur ri il le e s sa al le e n nu u s su un nt t d di is st ti in nc ct te e d do ou u c c t te e d do ou u ( (a al lt tf fe el l s sp pu us s: : p pr ri in n a an nu um mi it te e n no od du ur ri i
s se e t tr re ec ce e d de e m ma ai i m mu ul lt te e o or ri i) ). .
Exemplu: n graful

5
5
5
15
lanul L2=[5, 2, 4, 1, 3, 2] este lan neelementar (prin 2 s-a trecut de dou ori).


Ciclu

D De ef fi in ni i i ie e. . F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e c ci ic cl lu u, , n n g gr ra af fu ul l G G, , l la an n u ul l C C = = [ [x x
i i1 1 , , x x
i i2 2, , , ,. .. .. ., , x x
i ik k ] ], , c cu u
p pr ro op pr ri ie et ta at te ea a c c x x
i i1 1= =x x
i ik k i i a ar re e m mu uc ch hi ii il le e d di if fe er ri it te e d do ou u c c t te e d do ou u . .
Exemplu: n graful
lanul C=[ 1, 3, 2, 4, 1] este ciclu.




Definiie. F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e c ci ic cl lu u e el le em me en nt ta ar r, , n n g gr ra af fu ul l G G, , u un n c ci ic cl lu u c cu u
p pr ro op pr ri ie et ta at te ea a c c o or ri ic ca ar re e d do ou u n no od du ur ri i a al le e s sa al le e, , c cu u e ex xc ce ep p i ia a p pr ri im mu ul lu ui i i i a a u ul lt ti im mu ul lu ui i, , s su un nt t d di is st ti in nc ct te e. .
Exemplu: n graful

ciclul C=[ 1, 3, 2, 4, 1 ] este ciclu elementar.
Definiie. F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e c ci ic cl lu u n ne ee el le em me en nt ta ar r, , n n g gr ra af fu ul l G G, , u un n c ci ic cl lu u c cu u
p pr ro op pr ri ie et ta at te ea a c c n no od du ur ri il le e s sa al le e, , c cu u e ex xc ce ep p i ia a p pr ri im mu ul lu ui i i i a a u ul lt ti im mu ul lu ui i, , n nu u s su un nt t d di is st ti in nc ct te e. .
Exemplu: n graful

ciclul C=[5, 3, 4, 1, 2, 4, 5] este ciclu neelementar (prin 4 s-a trecut de dou ori).
Definiie. F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . D Do ou u c ci ic cl lu ur ri i C C1 1 i i C C2 2 s su un nt t e eg ga al le e, , d da ac c m mu uc ch hi ii il le e l lo or r i in nd du uc c
a ac ce el la a i i g gr ra af f p pa ar r i ia al l a al l s su ub bg gr ra af fu ul lu ui i g ge en ne er ra at t d de e v v r rf fu ur ri il le e c ce e a ap pa ar r i in n l lu ui i C C1 1, , r re es sp pe ec ct ti iv v l lu ui i C C2 2. .
Exemplu: n graful

ciclul Cl=[1, 3, 2, 4, 1] este egal cu ciclul C2=[ 3, 2, 4, 1, 3].
Observaie. Un ciclu se numete par, dac lungimea sa este un numr par i se numete impar, dac
lungimea sa este un numr impar.

Graf conex

D De ef fi in ni i i ie e. . F Fi ie e G G= =( (V V, ,M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . G Gr ra af fu ul l G G s se e n nu um me e t te e c co on ne ex x d da ac c p pe en nt tr ru u o or ri ic ca ar re e d do ou u v v r rf fu ur ri i x x
i i y y, , x x y y, , e ex xi is st t u un n l la an n n n C C d de e l la a x x l la a y y. .
Exemplu de graf conex:

Graful este conex, deoarece oricare ar fi vrfurile x i y, x y, exist un lan n G care s le lege.
5
5
5
1
2 3
4
5
16
Exemplu de graf care nu este conex:


Graful nu este conex, deoarece exist dou vrfuri, cum ar fi 1 si 4, pentru care nu exist nici un lan n
graf care s le lege.
Component conex

D De ef fi in ni i i ie e. . F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e c co om mp po on ne en nt t c co on ne ex x , , u un n g gr ra af f n ne eo or ri ie en nt ta at t
G G
1 1= =( (V V
1 1, ,M M
1 1) ) c ca ar re e v ve er ri if fi ic c u ur rm m t to oa ar re el le e c co on nd di i i ii i: :
- - e es st te e s su ub bg gr ra af f a al l g gr ra af fu ul lu ui i G G; ;
- - e es st te e c co on ne ex x; ;
- - n nu u e ex xi is st t n ni ic ci i u un n l la an n n n G G c ca ar re e s s l le eg ge e u un n n no od d d di in n V V
1 1
c cu u u un n n no od d d di in n V V- -V V
1 1. .
Exemplu: Fie graful G=(V, M) : V={ 1,2,3,4,5,6},M={[ 1,2], [1,3], [2,3],[4,5], [4,6]}




Pentru graful de mai sus, graful G1=(V1,M1) unde: V1={4,5,6} i M1={ [4,5], [4,6]} este component
conex, deoarece:
- este subgraf al grafului G;
- este conex:
- nu exist nici un lan n G care i lege un nod din V
1
, cu un nod din V-V
1
={1,2 3},
La fel se poate spune i despre graful G2=(V2,M2) unde: V2={1,2,3} i M2={[1,2], [1,3], [2,3]}
n concluzie, graful, din figura de mai sus, este format din dou componente conexe.
Observaie. Fie G=(V, M) un graf neorientat. Graful G este conex dac i numai dac este format dintr-
o singur component conex.
Exemplu de graf conex (este format dintr-o singur component conex):



Observaie. Fie G=(V, M) un graf neorientat. Pentru a verifica dac graful este format din una sau mai
multe componente conexe se procedeaz astfel:
- se parcurge graful, prin una din metodele de parcurgere;
- dac dup parcurgere mai exist n graf noduri nevizitate, atunci graful este format din mai multe
componente conexe, altfel este format dintr-o singur component conex, adic graful este conex.
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int a[20][20];
int viz[20];
int i, n ,j, pl, m, x, y, ok;
void parc_adancime(int pl)
{int j;
viz[pl]=1;
for (i=1;j<=n;j++)
if ((a[pl][j]==1) && (viz[j]==0))
parc_adancime(j);}
void main(){
cout<<"n m "; cin>>n>>m;
for (i=1;i<=m;i++)
{cout<<"x y"; cin>>x>>y;
a[x][y]=1; a[y][x]=1;}
for (i=1;i<= n;i++) viz[i]=0;
cout<<"dati nodul de plecare :"; cin>>pl;
parc_adancime(pl);
1
2 3
4
5
1
2
3
4
5
6
1
2 3
4
5
17
ok=0; //se verifica daca mai sunt
for (i=1;i<=n;i++) //noduri nevizitate
if (viz[i]==0) ok=1;
if (ok) cout<<"graful este format din mai multe componente conexe";
else cout<<"graful este conex";
getche( ); }

11. Grafuri Hamiltoniene

D De ef fi in ni i i ie e. . F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e l la an n h ha am mi il lt to on ni ia an n, , n n g gr ra af fu ul l G G, , u un n l la an n e el le em me en nt ta ar r
c ca ar re e c co on n i in ne e t to oa at te e v v r rf fu ur ri il le e g gr ra af fu ul lu ui i G G. .
Exemplu de lan hamiltonian:
Fie graful G=(V, M) unde: V={1,2,3,4}, M={[l,3], [1,4],[2,3],[2,4],}
Reprezentarea sa grafic este:

Lanul L=1, 3, 2, 4 este, n graful G, lan hamiltonian.
D De ef fi in ni i i ie e. . F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e c ci ic cl lu u h ha am mi il lt to on ni ia an n, , n n g gr ra af fu ul l G G, , u un n c ci ic cl lu u
e el le em me en nt ta ar r c ca ar re e c co on n i in ne e t to oa at te e v v r rf fu ur ri il le e g gr ra af fu ul lu ui i G G. .
Exemplu de ciclu hamiltonian:
Fie graful G=(V, M) unde: V={ 1,2,3,4} M={ [1,3], [1,4], [2,3],[2,4]}
Reprezentarea sa grafic este:

Ciclul C=1, 3, 2, 4, 1este, n graful G, ciclu hamiltonian.
D De ef fi in ni i i ie e. . F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . G Gr ra af fu ul l G G e es st te e h ha am mi il lt to on ni ia an n d da ac c c co on n i in ne e c ce el l p pu u i in n u un n c ci ic cl lu u
h ha am mi il lt to on ni ia an n. .
Exemplu de graf hamiltonian:
Graful G=(V, M) unde:V={ 1,2,3,4} M={[1,2], [1,3], [1,4], [2,31, [2,4]}
cu reprezentarea grafic:

este hamiltonian, deoarece conine cel puin un ciclu hamiltonian; ciclul C= l, 3, 2, 4, 1 este, n graful G,
ciclu hamiltonian.
Observaie. Fie G=(V, M) un graf neorientat. Ca n graful G s existe un ciclu hamiltonian, trebuie ca el
s aib cel puin trei vrfuri.
Teorem. Graful complet K
n
este graf hamiltonian.
Demonstraie:
Orice succesiune x
i1
, x
i2
, ,..., x
in
; x
i1
de n+ 1 noduri distincte (excepie fac primul i ultimul) am alege,
poate fi privit ca un ciclu hamiltonian, deci graful K
n
este hamiltonian.
Teorem. Fie G= (V, M) un graf neorientat. Dac are n3 noduri i gradul fiecrui vrf x verific relaia
d(x) n/2, atunci G este hamiltonian.

Problema determinri tuturor ciclurilor hamiltoniene dintr-un graf neorientat.
Fie G=(V, M) un graf neorientat, cu n vrfuri. S se determine toate ciclurile hamiltoniene din graful G.
Rezolvare: Problema se rezolv folosind metoda Backtracking. Pentru rezolvare se vor folosi:
k : variabil ntreag care reprezint la al ctelea nod s-a ajuns(al doilea, al treilea...)
x : vector cu componente ntregi cu proprietatea: x
k
:reprezint al k-lea nod din ciclu.
3
3
3
18
Observaie. Pentru a evita parcurgerea unui drum de 2 ori se va recurge la strategia de a atribui lui x,
valoarea l, adic toate ciclurile s plece de la primul nod: din acest motiv x
k
{2.... n} pentru k{2,... n}
n concluzie, a rezolva problema nseamn a determina vectorii:
x=(x
1
,x
2
,...,x
n
)
unde x
1
=1 i x
k
{2.... n} pentru k{2,... n
Tabla va arta astfel:


n
2 3 ...... n-1 n
2 3 ...... n-1 n
... ... ...... ... ...
2 3 ...... n-1 n
2 3 ...... n-1 n
1
2 n

Pentru reprezentarea grafului n program se va folosi matricea de adiacen, definit astfel:
a
i,j
=1, dac exist muchie ntre nodurile i i j;
a
i,j
=0, dac nu exist muchie ntre nodurile i i j.
Exemplu: Pentru graful de mai jos


matricea de adiacen se definete astfel:
|
|
|
|
|
|

\
|
=
0 0 1 1 1
0 0 1 1 1
1 1 0 0 0
1 1 0 0 1
1 1 0 1 0
A
Concluzii:
1. ntre nodurile k si i, exist muchie dac a
k,i
=1 (i a
i,k
=1), deci ntre nodurile x
k
i x
j
exist muchie dac
a[x
k
][x
i
]=1 (si a[x
i
][x
k]
=1).
2. Nodul x
k
trebuie s fie diferit de nodul x
i
, pentru i=1...k-1.
3. Nodul x
n
trebuie s fie legat prin muchie de nodul x
1
adic a[x
n
][x
1
]=1
* Comentarii la procedura Valid:
Trebuie verificat c:
1. exist muchie ntre nodurile x
k-1
i x
k
, adic trebuie verificat c a[x
k-1
][x
k
]=1;
2. nodul x
k
este diferit de toate nodurile prin care s-a trecut, adic:
x
k
x
i
pentru i=1...k-1.
3. dac s-a ajuns la al n-lea nod din ciclu, trebuie s existe muchie ntre acesta primul nod, adic: dac
k=n atunci a[ x
k
][x
1
]=1
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int sir[20];
sir x;
int i, k, n;
int as, ev;
int a[20][20];
void succ(sir x, int k, int &as)
{if (x[k]<n)
{as=1;
x[k]=x[k]+1;}
k
x
k
19
else as=0;}
void valid( sir x, int k, int &ev)
{ev=l ;
if (a[x[k-1]][x[k]]==0) dac nu exist drum ntre x
k-1
i x
k

ev=0;
else
{for (i=1;i=k-l;i++)
if (x[i]==x[k]) ev=0;
if ((k==n) && (a[x[n]][x[l]]==0)) ev=0;}
}
void afis(sir x, int k)
{int i;
for (i=l;i<=k;i++)
cout<<x[i]<< ;
cout<<x[1]<<" "; cout<<endl;}
void main() {
cout<<"n= "; cin>>n;
for (i=1;i<=n-l;i++)
for (j=i+l;j<=n;j++)
{cin>>a[i][j];
a[j][i]=a[i][j]; }
x[1]=1;
k=2;
x[k]=1; privii tabla
while (k>1){
do{succ(x,k,as);
if (as) valid(x,k,ev);
}while (as && !ev);
if (as)
if (k==n) afis(x,k);
else
{k=k+ 1;
x[k]=1;}
else k=k-l;
}
getch();}

12. Grafuri Euleriene

Definiie. F Fi ie e G G= =( (V V, , M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e l la an n e eu ul le er ri ia an n, , i in n g gr ra af fu ul l G G, , u un n l la an n c ca ar re e c co on n i in ne e
t to oa at te e m mu uc ch hi ii il le e g gr ra af fu ul lu ui i G G, , f fi ie ec ca ar re e m mu uc ch hi ie e a ap p r r n nd d n n l la an n o o s si in ng gu ur r d da at t . .
Exemplu de lan eulerian:
Fie graful G=(V, M) unde: V={ 1,2,3,4} M={[1,3],[2,3], [2,4]}
Reprezentarea sa grafic este:

Lanul L=[1, 3, 2, 4] este, in graful G, lan eulerian.
Definiie. F Fi ie e G G= = ( (V V, ,M M) ) u un n g gr ra af f n ne eo or ri ie en nt ta at t. . S Se e n nu um me e t te e c ci ic cl lu u e eu ul le er ri ia an n, , n n g gr ra af fu ul l G G, , u un n c ci ic cl lu u c ca ar re e c co on n i in ne e
t to oa at te e m mu uc ch hi ii il le e g gr ra af fu ul lu ui i G G, , f fi ie ec ca ar re e m mu uc ch hi ie e a ap p r r n nd d n n c ci ic cl lu u o o s si in ng gu ur r d da at t . .
Exemplu de ciclu eulerian:
Fie graful G=(V, M) unde: V={1,2,3,4} M={ [ 1,3], [ 1,4], [2,3], [2,4]}
Reprezentarea sa grafic este:
2
3
20

Ciclul C=[ l, 3, 2, 4, l ] este, n graful G, ciclu eulerian.
Teorem. Fie G=(V, M) un graf neorientat. Graful G, fr vrfuri izolate, este eulerian dac i numai
daca este conex i gradele tuturor vrfurilor sale sunt numere pare.
Exemplul l.
Fie graful G=(V, M) unde: V={1,2,3,4}
M={ [ 1,3], [ 1,4], [2,3], [2,4]}
Reprezentarea sa grafic este:

este graf eulerian, deoarece verific condiiile teoremei anterioare, adic:
- nu are vrfuri izolate;
- este conex;
- gradele tuturor vrfurilor sunt numere pare.
D De ef fi in ni i i ie e. . Un Un g gr ra af f c ca ar re e c co on n i in ne e c ce el l p pu u i in n u un n c ci ic cl lu u e eu ul le er ri ia an n s se e n nu um me e t te e g gr ra af f e eu ul le er ri ia an n. .

Algoritmul de determinare a unui ciclu eulerian ntr-un graf neorientat.

Pas 1. Se detemin ciclul C=(c
1
,c
2
,..., c
k
, c
1
), unde c
1
=1.



Pas 2. Se caut, printre nodurile ciclului determinat la pasul anterior, un nod pentru care mai exist
muchii incidente cu el neluate nc. Fie acesta c
j
construim ciclul C
n
= (cn
1
,cn
2
,..., cn
k
, cn
1
), unde cn
i
=c
j

cn- ciclu nou


Pas 3.Ciclul determinat la pasnl 2 se "concateneaz" la ciclul C, obinndu-se astfel ciclul C=(c
1
,c
2
,..., c
j
,
c
j+1
...,c
j+kn-1
,..., c
k+kn
, c
1
), figurat mai jos:

Pas4. Dac nu sau ales toate muchiile, se reia pasul 2.
Exerciiu: Pentru graful din figura de mai jos, s se determine un ciclu eulerian.

Rezolvare:
Pas1. Se determin un ciclu plecnd de la nodul 1; fe acesta: C-('l, 3, 4, 2, 1) (privii figura).
2
3
2
3
c
2
c
1
c
k
1
21

Pas2. Se caut, printre nodurile ciclului determinat la pasul anterior, un nod pentru care mai exist muchii
incidente cu el neluate nc; fie acesta nodul 4 -1. Construim ciclul Cn, plecnd de la acest nod: Cn= (4, 5,
6,7,8,4 )

Pas3. Ciclul determinat la pasul 2 se "concateneaz la ciclul C, obinndu-se astfel ciclul: C=(1, 3, 4, 5, 6,
7,8, 4, 2, 1 )


Pas4. Deoarece mai sunt muchii neluate nc, se reia pasul 2.
Pas2. Se caut, printre nodurile ciclului determinat pn n prezent, un nod pentru care mai exist muchii
incidente cu el neluate nc; acesta este nodul 4. Construim ciclul Cn, plecnd de la acest nod: Cn=(4, 9,
10,4).

Pas 3. Ciclul determinat la pasul 2 se "concateneaz la ciclul C, obinndu-se astfel ciclul: C=(1, 3, 4, 9,
10, 4, 5, 6, 7, 8, 4, 2, 1).

programul de determinare a unui ciclu eulerian ntr-un graf neorientat.
#include <iostream.h>
#include<conio.h>
#include<stdio.h>
typedef int mut[20][20];
typedef int sir[20];
int a[20][20];
sir viz, c, cn, gr;
int i, k, j, n, kn, poz, m, eulerian, x, y;
int grad(int i)
{ int s, j;
s=0;
for (j=1;j<=n;j++) s=s+a[i][j];
return s;}
int varf_izolate()
{ int i, ok;
ok=0;
for (i=1; i<=n; i++)
if (grad(i)==0) ok=1;
return ok;}
int grade_pare()
{ int i, ok;
22
ok=1;
for (i=1;i<=n;i++)
if (grad(i)%2!=0) ok=0;
return ok;}
void adancime(int i )
{ int j;
viz[i]=1;
for (j=1;j<=n;j++)
if ((viz[j]==0) && (a[i][j]==1)) adancime(j);}
int conex()
{int i, ok;
for (i=1;i<=n;i++) viz[i]=0;
adancime(1);
ok=1;
for (i=1;i<=n;i++)
if (viz[i]==0) ok= 0;
return ok;}
void main( )
{ clrscr( );
cout<<"m="; cin>>m;
cout<<"n="; cin>>n;
for (i=1;i<=m;i++)
{ cout<<"x y"; cin>>x>>y;
a[x][y]=a[y][x]=1;}
for (i=1;i<=n;i++) gr[i]=grad(i);
eulerian=(!varf_izolate()) && grade_pare()&&conex();
if (!eulerian) cout<<"graful nu este eulerian";
else
{c[1]=1;
k=1;
do{
for (j=1;j<=n;j++)
if (a[c[k]][j]==1)
{k=k+1;
c[k]=j;
gr[c[k] ]=gr[c[k]]-1;
gr[c[k-1]]=gr[c[k-1]]-1;
a[c[k-1]][c[k]]=0;
a[c[k]][c[k-1]]=0;
break;}
}while (c[k]!=1);
while (k-1<m){
for (j=1;j<=k-1;j++)
if (gr[c[j]]>0) { cn[1]=c[j];
poz= j;
break;}
kn=1;
do{
for (j=1;j<=n;j++)
if (a[cn[kn]][j]==1)
{ kn=kn+1;
cn[kn] =j;
gr[cn[kn]]=gr[cn[kn]]-1 ;
gr[cn[kn-1]]=gr[cn[kn-1]]-1;
a[cn[kn-1]][cn[kn]]=0;
23
a[cn[kn]][cn[kn-1]]=0;
break;}
}while (cn[kn]!=cn[1]);
for (j=k;j>=poz;j--) c[j+kn-1]=c[j] ;
for (j=1 ;j<=kn-1;j++) c[poz+j]=cn[j+1];
k=k+kn-1;
}
}
for (i=1;i<=k;i++)
cout<<c[i]<<" ";
getche(); }


Probleme
1. Noiunea de graf neorientat
1. S se precizeze dac reelei de circulaie din oraul dumneavoastr i se poate asocia un graf neorientat;
n caz afirmativ, s se defineasc graful corespunztor.
2. Avnd la dispoziie un grup de n persoane, n N* , s se precizeze dac i se poate asocia un graf
neorientat; n caz afirmativ, s se defineasc graful corespunztor.
3. Avnd la dispoziie o hart cu n rii, n N*. s se precizeze dac i se poate asocia un graf neorientat;
n caz afirmativ, s se defineasc graful corespunztor.
4. Avnd la dispoziie toate stelele, s se precizeze dac li se poate asocia un graf neorientat; justificai
rspunsul.
5. Pentru graful reprezentat n figura de mai jos
a) precizai mulimea nodurilor;
b) precizai mulimea muchiilor;
c) dai exemple de noduri adiacente;
d) pentru fiecare muchie precizai extremitile
sale;
e) dai exemple de muchii incidente.

2. Noiunea de graf parial
1. S se determine dou grafuri pariale ale grafului de mai jos:


2. S se determine toate grafurile pariale ale grafului de mai jos:

3. Fie G un graf neorientat, cu n vrfuri i m muchii. S se determine numrul grafurilor pariale ale
grafului G.
4. Se citesc din 2 fiiere text informaii despre 2 grafuri neorinetate: pe prima linie numrul de noduri i
de pe urmtoarele rnduri, matricea de adiacen. S se verifice daca graful reinut n cel de-al doilea
fiier este graf parial al grafului reinut n primul fiier
5. Se citesc dintr-un fiier informaiile despre graful neorintat: de pe prima linie numrul de noduri n i
eticheta unui nod x, i apoi, de pe urmtoarele rnduri, matrice de adiacen a grafului. S se afieze ntr-
un alt fiier text informaiile despre graful paial obinut prin eliminarea tuturor muchiilor care au
extremiti un nod cu gradul par i nodul x.
3. Noiunea de subgraf
1. S se determine dou subgrafuri ale grafului de mai jos:

1
5
5
1
1
1
24

2. S se determine toate subgrafurile grafului de mai jos:

3. Fie G un graf neorientat, cu n vrfuri i m muchii. S se determine numrul subgrafurilor grafului G.
4. Se citesc din 2 fiiere informaiile despre 2 grafuri neorintate: de pe prima linie numrul de noduri n i
apoi, de pe urmtoarele rnduri, matricea de adiacen a grafului. n fisierul al doilea pe ultimul rnd dup
matricea de adiacen, este memorat un ir ce reprezint etichetele nodurilor. S se verifice dac graful 2
este subgraf al grafului 1.
4. Gradul unui vrf
l. Fiind dat graful de mai jos, s se determine pentru fiecare vrf n parte gradul su; s se precizeze
vrfurile terminale i vrfurile izolate.


2. S se demonstreze c orice graf G, cu n 2 noduri, conine cel puin dou vrfuri care au acelai grad.
3. S se verifice dac exist grafuri cu 5 noduri pentru care:
a) irul gradelor vrfurilor sale este: 1,2,3,0,5
b)irul gradelor vrfurilor sale est3: 1,2,3,4,1
4.Fie graful G, cu n vrfuri i m muchii, astfel nct s fie ndeplinit relaia:
( )( )
2
2 1
>
n n
m
S se demonstreze c G nu are vrfuri izolate.
5. Fie G un graf neorientat, cu n vrfuri i m muchii, reprezentat prin matricea de adiacen. S se
realizeze programe, n C/C++, care:
a) afieaz gradele tuturor vrfurilor;
b) afieaz vrfurile de grad par;
c) afieaz vrfurile izolate;
d) afieaz vrfurile terminale;
e) verific dac graful are vrfuri izolate;
t) verific dac graful are vrfuri terminale;
g) verific dac graful are vrfuri interioare (nu sunt nici izolate nici terminale);
h) verific dac graful are toate vrfurile izolate;
i) verific dac graful are toate vrfurile interioare (nu sunt nici izolate nici terminale):
j) afieaz gradul unui vrf dat:
k) afieaz vecinii unui nod dat, vf;
l) verific dac un vrf dat este terminal, izolat sau interior;
m) afieaz gradul cel mai mare i toate vrfurile care au acest grad
n) afieaz frecventa vrfurilor:
izolate : n 1
terminale : n2
interioare : n3
o) fiind dat irul g
1
, ...,g
n
, s se verifice dac poate reprezenta irul gradelor vrfurilor n aceast ordine;
p) fiind dat irul g
1
...,g
n
, s se verifice dac poate reprezenta irul gradelor vrfurilor (nu neaprat n
aceast ordine).

5
1
5
1
6
25
5. Graf complet
1. Fiind date grafurile de mai jos, s se precizeze care dintre ele este complet i s se justifice rspunsul.
a
1



b

2. Pentru grafurile K
3
i K
5
:
a) s se precizeze gradul fiecrui vrf;
b) s se precizeze numrul de muchii;
c) s se realizeze o reprezentare grafic.
3. Fie graful G, cu n vrfuri, dat prin matricea de adiacen. S se realizeze un subprogram care
precizeaz dac graful este complet, astfel:
a) fcnd o analiz asupra nodurilor;
b) fcnd o analiz asupra muchiilor.
4. Fie graful G, cu n vrfuri, dat prin matricea de adiacen. S se realizeze subprograme care precizeaz:
a) cte muchii mai trebuie adugate pentru a deveni complet;
b) ntre ce noduri mai trebuie adugate muchii astfel nct graful s devin complet.
6. Graf bipartit
l. Fiind date grafurile de mai jos, s se precizeze care dintre ele este bipartit i s se justifice rspunsul.
a)



b)

2. Ce muchie trebuie eliminat din graful prezentat mai jos astfel nct s devin bipartit?

3. Fie graful bipartit G, fr vrfuri izolate, dat prin matricea de adiacen. S se realizeze un program
care determin mulimile V 1 i V2 despre care se vorbete n definiie.
4. Fie graful G cu n vrfuri, dat prin matricea de adiacen. S se realizeze un program care precizeaz
dac graful este bipartit.
5. Sa se genereze toate grafurile neorientate bipartite complete cu n noduri.
7. Graf bipartit complet
1. Fiind date grafurile de mai jos s se precizeze care dintre ele este bipartit complet i s se justifice
rspunsul.
a)



b)
2. Ce muchie trebuie adugat n graful prezentat mai jos astfel nct s devin bipartit complet:
3
5
3
5
3
1
5
3
5
3
26

3. Fie graful G, cu n vrfuri reprezentate {1... n}. Presupunnd c graful este bipartit complet, astfel
nct { } p V si n p cu p V ,..., 1 ,
1 1
= < = s se construiasc matricea de adiacen.
4. Fie graful G, cu n vrfuri reprezentate {1... n}. Presupunnd c graful este bipartit complet i c V 1
este format din nodurile reprezentate prin numere pare, s se construiasc matricea de adiacen.
5. S se determine numrul total de grafuri bipartit complete cu n vrfuri date.


8. Reprezentarea grafurilor
l. Fiind date grafurile de mai jos
a) l



b)

s se precizeze pentru fiecare in parte:
l. matricea de adiacen
2. listele de adiacen
3. irul muchiilor
2. Fiind dat o matrice ptratic de ordin n, s se precizeze dac poate fi considerat matricea de
adiacent a unui graf neorientat cu n vrfuri.
3. S se determine numrul total de grafuri neorientate care au vrfurile { 1,...,n}.
4. S se realizeze un program care genereaz matricele de adiacen ale tuturor grafurilor neorientate cu
vrfurile { 1,...,n}.
5. S se realizeze un program n C++ care, fiind date matricele de adiacen A1 i A2 de dimensiune n,
verific dac matricea A2 poate reprezenta un graf partial al grafului reprezentat de matricea A1.
6. S se realizeze un program n C++ care s verifice dac un graf este pentru alt graf subgraf.
7. S se realizeze un program care genereaz toate grafurile bipartite complet cu n vrfuri.
8. Fie G un graf neorientat, cu n vrfuri i cu muchiile m
1
, m
2
..., m
p
. S se realizeze un program, n C++,
care determin toate grafurile pariale ale lui G.
9. Fie G un graf neorientat, cu vrfurile 1, 2, ..., n, dat prin matricea de adiacent. S se realizeze un
program n C++ care determin toate subgrafurile lui G.
10. Fiind dat un grup de persoane, reprezentate prin numere de la 1 la n, si precizndu-se relaiile de
simpatie astfel: pentru fiecare persoan i, se citesc numerele de ordine ale persoanelor pe care aceasta le
simpatizeaz (numerele se dau pe aceeai linie separate prin spaii), s se precizeze dac n grupul de
persoane amintit, toate simpatiile sunt reciproce.
11. S se realizeze un program care permite desenarea unui graf neorientat cu n vrfuri i m muchii,
cunoscndu-se lista muchiilor.

9. Parcurgerea grafurilor

1.Fiind date grafurile de mai jos:
a) l



b)

5
2
3
27
s se precizeze, pentru fiecare n parte, lista nodurilor obinut n urma parcurgerii:
- n lime;
- n adncime.
2. Fie G un graf, cu n noduri i m muchii. Precizndu-se un nod, de exemplu nodul l, sa se realizeze un
program care afieaz toate nodurile accesibile din acest nod.


10. Conexitate
1.Fiind date grafurile de mai jos:
a) l



b)
sa se precizeze pentru fiecare n parte un lan, un lan de lungime 4, un lan elementar, un ciclu, un ciclu
elementar, dou cicluri egale.
2. Fie G un graf neorientat, cu n noduri i m muchii. Precizndu-se doua noduri np( nodul de plecare) i
ns (nodul de sosire), s se determine toate lanurile elementare care le admit ca extremiti.
3. Fiind dat un graf neorientat, cu n noduri i m muchii s se determine toate lanurile elementare care au
cea mai mare lungime.
4. S se realizeze un program care, fiind dat un graf neorientat, verific dac conine un ciclu de lungime
5. S se realizeze un program care, fiind dat un graf neorientat, afieaz toate ciclurile elementare de
lungime p, plecnd de la nodul 1 .
6. S se realizeze un program care, fiind dat un graf neorientat , determin cte componente conexe are.
7. S se realizeze un program care, fiind dat un graf neorientat , determin toate componentele conexe ale
sale.
8. S se realizeze un program care, fiind dat un graf neorientat, determin toate perechile de vrfuri ntre
care exist cel puin un lan.
9. Speologii au cercetat n culoare subterane, pentru a stabili dac aparin aceleiai peteri. Prin tehnici
specifice de cureni de aer i de colorare a cursurilor de ap, a fost demonstrat existenta unor canale de
legtur ntre mai multe culoare. Precizndu-se perechile de culoare ntre care au fost stabilite legturi, s
se afle dac sistemul de culoare aparine unei singure peteri.
10. ntr-un grup de n persoane, se precizeaz perechi de persoane care se consider prietene. Folosind
principiul c "prietenul prietenului meu mi-este prieten", s se determine grupurile cu un numr maxim de
persoane ntre care se pot stabili relaii de prietenie, directe sau indirecte.

11. Cicluri Hamiltoniene
l. Pentru graful de mai jos; s se dea exemplu de un lan si de un ciclu hamiltonian.
l

2. S se realizeze un program care pentru un graf dat verific dac satisface condiiile teoremei prezentate
in seciunea 11.
3. S se arate c numrul ciclurilor hamiltoniene ale grafului K
n
cu n3, este
( )
2
! 1 n

4. S se arate c numrul ciclurilor elementare ale grafului K
n
cu n3, este
( ) ( )

=
+
n
k
k
k n n n
3
1 ... 1
2
1

5. S se realizeze un program care pentru un graf dat verific dac este hamiltonian.
28
6. La curtea regelui Artur s-au adunat 2n cavaleri si fiecare dintre ei are printre cei prezeni cel mult n-1
dumani. Artai c Merlin, consilierul lui Artur, poate s-i aeze pe cavaleri, la o mas rotund, n aa fel
nct nici unul dintre ei s nu stea alturi de vreun duman de-al su.
7. Se consider n persoane. Fiecare are printre cei prezeni cel mult n/2 dumani. S se determine toate
posibilitile de aezare a acestora la o mas rotund astfel nct nici unul dintre ei s nu stea lng un
duman al su.
8. La un cenaclu literar sunt invitai un numr de n elevi, identificaii cu l...n, de la L licee, identificate
1...L. S se determine toate modalitile de aezare a acestora la o mas rotund astfel nct s nu fie doi
elevi de la acelai liceu vecini.

1. Noiunea de graf neorientat
Problema 1
Rspunsul este afirmativ (Da). Definim graful neorientat asociat reelei astfel:
- mulimea nodurilor este mulimea interseciilor dintre strzi i a capetelor de strzi (la ieirea din ora);
este mulime finit i nevid
- mulimea muchiilor este mulimea bucilor de strad dintre dou intersecii sau dintre o intersecie i un
capt de strad (ia ieirea din ora).
Problema 2
Rspunsul este afirmativ (Da). Definim graful neorientat asociat astfel:
- mulimea nodurilor este mulimea persoanelor (este mulime finit i nevid);
- muchia dintre nodurile x i y se definete ca fiind reprezentarea ideii "persoanele x i y se cunosc" (pot
exista nenumrate definiii; dai i altele).
Problema 3
Rspunsul este afirmativ (Da). Definim graful neorientat asociat astfel:
- mulimea nodurilor este mulimea rilor (este mulime finit i nevid):
- muchia dintre nodurile x i y se definete ca fiind reprezentarea ideii "din ara x se poate ajunge n ara
y, cu avionul" (pot exista nenumrate definiii).
Problema 4
Dac admitem c exist o infinitate de stele: Rspunsul este negativ (Nu), deoarece mulimea nodurilor
trebuie s fie, conform definiiei, finit (i nevid).
Dac admitem ca stelele sunt ntr-un numr finit: Rspunsul este pozitiv (Da) i putem defini graful
neorientat asociat lor astfel:
- mulimea nodurilor este mulimea stelelor (este mulime finit i nevid);
- muchia ntre nodurile x i y se definete ca fiind reprezentarea ideii "de pe steaua x se poate vedea
steaua y" (pot exista nenumrate definiii).
Problema 5
a) V={ l, 2, 3,4 ,5};
b) M={[1,2], [1,4], [1,5], [2,4], [3,5]};
c) Nodul 1 este adiacent cu nodul4; nodul 3 este adiacent cu nodul 5; ...
d) [1,2] : 1 i 2; [1,4] : 1 i 4; [1,5] : 1 i 5; [2,4] : 2 i 4; [3,5] : 3 si 5; e) [1,2] i [1,4]; [2,4] i [l,4]; ...

2. Noiunea de graf parial

Problema 1
Cele dou grafuri pariale vor fi reprezentate prin desen n figurile de mai jos: Primul graf parial (se
elimin muchiile [1,5], [2,4])
V
1
={ l, 2, 3, 4. 5}
M
1
={ [ 1,5], [1,4] ,[3,5]}

Al doilea graf parial (se elimin muchiile [1,2], [1,4], [3,5];)
V
1
={ l, 2, 3, 4. 5}
M
1
={ [ 1,5], [2,4] }

Problema 2
Grafurile pariale, care se obin plecnd de la graful din enun, sunt n numr de:
1
2
4
3
5
1
2
3
4
5
29
1 dac se elimin 0 muchii
0
3
C

3 dac se elimin o muchiile
1
3
C
3 dac se elimin dou muchii
2
3
C
1 dac se elimin toate muchiile
3
3
C
deci, n total, 1+3+3+1=8 grafuri pariale.

Problema 3
Avnd in vedere c: "un graf parial al grafului numr oarecare de muchii", putem scrie:
Numrul total al grafurilor pariale ale grafului G, este suma dintre numrul grafurilor pariale care se
obin:
prin eliminarea unui numr de 0 muchii:
0
m
C
prin eliminarea unui numr de 1 muchii:
1
m
C
prin eliminarea unui numr de 2 muchii:
2
m
C
.........................................................
prin eliminarea unui numr de m-1 muchii:
1 m
m
C
prin eliminarea unui numr de m muchii:
m
m
C
prin adunare se obine:
0
m
C +
1
m
C +
2
m
C +...+
1 m
m
C +
m
m
C =2
m
Observaie. Suma de mai sus se calculeaz astfel:
n relaia
0
m
C +
1
m
C x
1
+
2
m
C x
2
+...+
1 m
m
C x
m-1
+
m
m
C x
m
=(1+x)
m
se nlocuiete x cu valoarea 1.

Problema 4
Se citesc din 2 fiiere text informaii despre 2 grafuri neorinetate: pe prima linie numrul de noduri i de
pe urmtoarele rnduri, matricea de adiacen. S se verifice daca graful reinut n cel de-al doilea fiier
este graf parial al grafului reinut n primul fiier.
Rezolvare:
Se verific dac cele 2 grafuri au acelai numr de noduri i dac graful G2 nu conine muchii care nu
exist n graful G1. Matricile de adicen ale celor 2 grafuri au dimensiunea n, respectiv m. Funcia
grafp() verific dac G2 este graf parial al grafului G1.
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
int a1[20][20],a2[20][20],i,j,n,m;
ifstream f1("gp1.txt");
ifstream f2("gp2.txt");
int grafp()
{if(m!=n) return 0;
else for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a2[i][j]==1 &&a1[i][j]==0)
return 0;
return 1;}
void main()
{
clrscr();
f1>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
f1>>a1[i][j]; f1.close();
f2>>m;
for (i=1;i<=m;i++)
for (j=1;j<=m;j++)
f2>>a2[i][j]; f2.close();
if(grafp()) cout<<"este graf partial";
else cout<<"nu este graf partial";
getche();}














gp1.txt
4
0 1 0 1
1 0 1 0
0 1 0 0
30
1 0 0 0

gp2.txt
0 1 0 1
1 0 0 0
0 0 0 0
1 0 0 0


Problema 5.
Se citesc dintr-un fiier informaiile despre graful neorintat: de pe prima linie numrul de noduri n i
eticheta unui nod x, i apoi, de pe urmtoarele rnduri, matrice de adiacen a grafului. S se afieze ntr-
un alt fiier text informaiile despre graful paial obinut prin eliminarea tuturor muchiilor care au
extremiti un nod cu gradul par i nodul x.


Rezolvare:
n vectorul v se rein nodurile de grad par.
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
int a[20][20],v[20],i,j,n,m,x;
ifstream f1("gp3.txt");
ofstream f2("gp4.txt");
int grad(int i)
{int j,g=0;
for(j=1;j<=n;j++) g=g+a[i][j];
return g;}
void graf_partial()
{int i,k=0;
for(i=1;i<=n;i++)
if(grad(i)%2==0) {k++; v[k]=i;}
for(i=1;i<=k;i++)
if(a[v[i]][x]==1) {a[v[i]][x]=0; a[x][v[i]]=0;}}
void scrie()
{int i,j;
f2<<n<<" "<<endl;
for (i=1;i<=n;i++)
for (j=1;j<i;j++)
if(a[i][j]==1) f2<<i<<" "<<j<<endl;
f2.close();}
void main()
{
f1>>n>>x;
while(f1>>i>>j)
a[i][j]=a[j][i]=1;
f1.close();
graf_partial();
scrie();}








gp3.txt
7 6
1 2
1 3
1 4
2 3
2 5
3 5
3 6
5 6
6 7
gp4.txt
7
2 1
3 1
3 2
4 1
5 2
5 3
6 5
7 6

3. Noiunea de subgraf
Problema 1
Cele dou subgrafuri vor fi reprezentate prin desen n figurile de mai jos:
Primul subgraf (se elimin nodul 1 (odat cu el i muchiile incidente [1,2], [1,4], [1,5]))
4

3 5
Al doilea subgraf (se elimin nodul 4 (odat cu el i muchiile incidente [l,4], [2,4]))
31
1

Problema 2
Subgrafurile care se obin plecnd de la graful din enun sunt n numr de:
1 dac se elimin 0 noduri
0
3
C

3 dac se elimin 1 nod
1
3
C
3 dac se elimin dou noduri
2
3
C
deci, n total 1+3+3=7 subgrafuri.
Atenie! Toate nodurile nu se pot elimina pentru c s-ar obine un graf cu mulimea vrfurilor vid (acest
lucru nu este permis de definiie).


Problema 3
Avnd n vedere c: un subgraf al grafului G se obine prin eliminarea unui numr oarecare de noduri
(diferit de numrul total de noduri ale grafului), putem scrie:
Numrul total al subgrafurilor grafului G este suma dintre numrul subgrafurilor care se obin:
prin eliminarea unui numr de 0 noduri:
0
n
C
prin eliminarea unui numr de 1 noduri:
1
n
C
prin eliminarea unui numr de 2 noduri:
2
n
C
........................................................
prin eliminarea unui numr de n-1 noduri:
1 n
n
C
prin adunare se obine:
0
n
C +
1
n
C +
2
n
C +...+
1 n
n
C +=2
n
-1
Problema 4
Se citesc din 2 fiiere informaiile despre 2 grafuri neorintate: de pe prima linie numrul de noduri n i
apoi, de pe urmtoarele rnduri, matrice de adiacen a grafului. In fisierul al doilea pe ultimul rnd dup
matricea de adiacen, este memorat un sir ce reprezint etichetele acestor noduri.S se verifice dac
graful 2 este subgraf al grafului 1.

#include<iostream.h>
#include<conio.h>
#include<fstream.h>
int n,m,i,j, a1[10][10],a2[10][10],v[10];
ifstream f1("sg1.txt");
ifstream f2("sg2.txt");
int subgraf()
{if(m>n) return 0;
else
{for (i=1;i<=m;i++) if(v[i]>n) return 0;
for (i=1;i<=m;i++)
for (j=1;j<=m;j++)
if(a2[i][j]!=a1[v[i]][v[j]]) return 0;}
return 1;}
void main()
{f1>>n;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++) f1>>a1[i][j];
f1.close();
f2>>m;
for (i=1;i<=m;i++)
for (j=1;j<=m;j++) f2>>a2[i][j];
for (i=1;i<=m;i++) f2>>v[i];
f2.close();
if(subgraf()) cout<<"este subgraf";
else cout<<"nu este subgraf";
getch();}













sg1.txt
4
0 1 1 1
1 0 1 0
32
1 1 0 1
1 0 1 0

sg2.txt
3
0 1 1
1 0 1
1 1 0
1 2 3

4. Gradul unui vrf
Problema 1
d(1)=3; d(3)=1; d(5)=2; 3 este vrf terminal;
d(2)=2; d(4)=2; d(6)=0; 6 este vrf izolat;
Problema 2
Fie V={x
1
, x
2
, .... x
n
}. Presupunem c graful nu conine dou vrfuri care s aib acelai grad, deci
d(x
i
)#d(x
j
) pentru i#j i d(x
i
){0,1,...,n-1} pentru i=1...n. n concluzie, irul gradelor vrfurilor coincide
cu {0,1,...,n-1} fcnd eventual abstracie de ordine (presupunem de exemplu : d(x
1
)=0, d(x
2
)=1, ...,
d(x
n
)=n-1). Deci, aa cum se vede i n exemplul prezentat ntre paranteze, exist un vrf care are gradul
0, adic nu este legat de nici un vrf, i un vrf care are gradul n- 1, adic este legat de toate celelalte, deci
i de cel de gradul 0. Contradicie, deoarece cel de gradul 0 nu este legat de nici un vrf.
n concluzie, presupunerea fcut la nceputul rezolvri este fals.
Problema 3
a) Categoric nu, deoarece dac ar exista un astfel de graf ar conine un vrf care ar avea gradul 5 (adic ar
fi legat de nc 5 vrfuri). Acest lucru nu se poate ntmpla deoarece fr el n graf mai sunt dect 4
vrfuri.
b) Dac un astfel de graf ar exista, l-am putea reprezenta astfel:


3
Nodul 3 a fost legat de nodul 5 (dar putea fi legat i de nodul 1); acest lucru nu este posibil deoarece astfel
acesta ar cpta gradul 2 i el practic l are l.
Problema 4
Presupunem c graful are un vrf izolat i toate celelalte noduri genereaz un subgraf complet (oricare
dou dintre ele sunt legate printr-o muchie), adic graful ar avea
( )( )
2
2 1 n n
muchii, oricum nu mai
multe dect
( )( )
2
2 1 n n
aa cum se spune n enun. Cum situaia aleas este cea mai convenabil n acest
sens, nseamn c un astfel de graf nu poate exista.
Problema 5
Observaie. A determina gradul vrfului i, nseamn a determina numrul elementelor care au valoarea 1
i se gsesc pe linia i n matricea de adiacen.
Mai jos, este prezentat muchia care returneaz gradul vrfului i (Funcia const n calcularea sumei
elementelor de pe linia i din matricea de adiacen).
Funcia care returneaz gradul nodului i
int grad( int i)
{int s, j;
s=0;
for (j=1;j<=n;j++)
s=s+aIi][j];
return s;}

problema a
#include<iostream.h>
#include<conio.h>
33
#include<stdio.h>
typedef int mat[20][20];
mat a;
int i, j, n;
int grad( int i)
{int s, j;
s=0;
for (j=1;j<=n;j++)
s=s+aIi][j];
return s;}
void main()
{ clrscr();
cout<<"n="; cin>>n;
for (i=1;i<=n-1;i++)
for (j=i+1;j<=n;j++)
{cout<<"a["<<i<<",<<j<<"]=; se citete matricea de adiacen
cin>>a[i][j];
a[j][i]=a[i][j];}
for (i=1;i<=n;i++)
cout<<"varful "<<i<<" are gradul"<< grad(i)<<endl;
getche(); }
Problema b
for (i=1;i<=n;i++)
if (grad(i) % 2==0) cout<<i<< ;
Problema c
for (i=1;i<=n;i++)
if (grad(i) ==0) cout<<i<< ;
Problema d
for (i=1;i<=n;i++)
if (grad(i) ==1,) cout<<i<< ;
Problema e
ok=0;
for (i=1;i<=n;i++)
if (grad(i) ==0) ok=1;
if (ok) cout<<"Da";
else cout<<"Nu";
Problema f
ok=0;
for (i=1;i<=n;i++)
if (grad(i) =1) ok=1;
if (ok) cout<<"Da";
else cout<<"Nu";
Problema g
ok=0;
for (i=1;i<=n;i++)
if (grad(i) >1) ok=1;
if (ok) cout<<"Da";
else cout<<"Nu";
Problema h
ok=1;
for (i=1;i<=n;i++)
if (grad(i) !=0)
ok=0;
if (ok) cout<<"Da":
else cout<<"Nu";
34
Problema i
ok=1;
for (i=1;i<=n;i++)
if (grad(i) <=1)
ok=0;
if (ok) cout<<"Da";
else cout<<"Nu";
Problema j
cout<<"Dati varful; cin>>vf;
cout<<" varful "<<vf<<" are gradul "<< grad(vf);
Problema k
cout<<"Dati varful; cin>>vf;
for(j=1;j<=n;j++)
if (a[vf][j]==i ) cout<<j<< ;
Problema l
cout<<"Dati varful : ": cin>>vf;
if (grad(vf)==0) cout<<"varful "<<vf<<" este izolat"<<endl;
else if (grad(vf)==1) cout<<"varful "<<vf<<" este terminal";
else cout<<"varful "<<vf<<" este interior: ";
Problema m
- se determin gradul cel mai mare, n gr_max (este o problem simpl de determinare a maximului);
- se parcurg toate nodurile, cu i
dac gradul vrfului i este egal cu gr_max
se afieaz nodul i

gr_max=grad(1);
for (i=2;i<=n;i++)
if (grad(i)>gr_max) gr_max=grad(i);
cout<<''cel mai mare grad este "<< gr_max<<endl;
cout<<"si nodurile care au acest grad sunt"<<endl;
for ( i=l ; i<=n; i++)
if (grad(i)=gr_max) cout<<i<< ;
Problema n
n1=0; n2=0; n3=0;
for (i=1;i<=n;i++)
if (grad(i)=0) n1=n1+1;
else if (grad(i)==1) n2=n2+1;
else n3=n3+1;
cout<<"In graful dat sunt : "<<endl;
cout<<" "<<nl<<" varfuri izolate"<<endl;
cout<<" "<<n2<<" varfuri terminale"<<endl;
cout<<" <<n3<<" varfuri interioare"<<endl;
Problema o
for (i=1;i<=n;i++) cin>>g[i];
ok=1;
for (i=1;i<=n;i++)
if (grad(i)!=g[i]) ok=0;
cout<<ok;
Problema p
- se citete irul g;
- se construiete irul gradelor vrfurilor, gr;
- se sorteaz cresctor cele dou iruri, folosind funcia:
void sort_crescator(sir x, int n)
{int i, ok, aux;
do{
35
ok=1;
for (i=1;i<=n-l;i++)
if (x[i]>x[i+l])
{aux= x[i];
x[i]=x[i+1];
x[i+1] =aux;
ok=0; }
}while (ok==0);
}
- se verific dac sunt identice:
for (i=1;i<=n;i++) cin>>g[i];
for (i=1;i<:=n;i++) gr[i]=grad(i);
sort_crescator(g,n);
sort_crescator(gr,n);
ok=1;
for (i =1;i<=n;i++)
if (gr[i]!=g[i]) ok=0;
cout<<ok;


5. Graf complet

Problema 1
a. Graful nu este complet, deoarece exist dou noduri ntre care nu exist muchie (1 si 3).
b. Graful este complet, deoarece oricare ar fi dou vrfuri distincte exista o muchie care le unete.
Problema 2
a)K
3
: d(x)=3-1=2 V x ; K
5
: d(x)=5-1=4 V x ;
b) K
3
: m=3(3-1)/2=3; K
5
: m=5(5-1)/2=10;
c)

d) 1



Problema 3

Problema a
Observaie. A verifica c un graf este complet,
fcnd o analiz asupra vrfurilor, nseamn a
verifica dac toate vrfurile au gradul n-1.
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int mat[20][20];
mat a;
int i,j,n,c;
int grad( int i)
{int s,j;
s=0;
for (j=1;j<=n;j++) s=s+a[i][j];
return s;}
void complet(int &c)
{int i;
c=1;
for (i=1;i<=n;i++)
if (grad(i)!=n-1) c=0;
}
void main()
{ clrscr();
cout<<"n="; cin>>n;
for (i=1;i<=n-1;i++)
for (j=i+1 ;j<=n;j++)
36
{cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j];
a[j][i]=a[i][j];}
complet(c);
if(c==1) cout<<"graful este complet";
else cout<<"graful nu este complet";
getche(); }
Problema b
Observaie. A verifica c un graf este complet,
fcnd o analiz asupra muchiilor, nseamn a
verifica dac are n(n-1)/2 muchii, altfel spus:
trebuie verificat dac toate elementele de
deasupra diagonalei principale din matricea de
adiacen sunt egale cu 1.
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int mat[20][20];
mat a;
int i, j, n;
void complet()
{int i,j,nr=0;
for (i=1;i<=n-1;i++)
for (j=i+1 ;j<=n;j++)
if (a[i][j]==1) nr++;
if(nr==(n*(n-1)/2)) cout<<"graf complet";
else cout<<"graful nu este
complet";}
void main()
{ clrscr();
cout<<"n="; cin>>n;
for (i=1;i<=n-1;i++)
for (j=i+1;j<=n;j++)
{cout<<"a["<<i<<","<<j<<"]=";
cin>>a[i][j];
a[j][i]=a[i][j];}
complet();
getche();
}


6. Graf bipartit

Problema 1
a) Graful este bipartit, deoarece respect definiia; V1={ 1, 2, 3}, V2={4, 5}.
b) Graful este bipartit, deoarece respect definiia; Vl={ 1, 3}, V2= { 2, 4}.
Problema 2
Pentru a obine un graf bipartit, trebuie eliminat muchia [1,3]; V 1={ 1, 2, 3 } , V2={4, 5}.
Problema 3
Fie graful bipartit G, fr vrfuri izolate, dat prin matricea de adiacen. S se realizeze un program care
determin mulimile V 1 i V2 despre care se vorbete n definiie.
Rezolvare:
- la nceput V1=[ ] i V2=[ ]
- se parcurge matricea de adiacent, linie cu linie, deasupra diagonalei principale
dac pe linia i se gsete elementul a[i,j]=1,
atunci
dac i aparine deja lui V2 atunci
j se adaug la mulimea V1: V1:=Vl+1j]
altfel
i se adaug la mulimea V1: V 1:=V 1+[i]
j se adaug la mulimea V2: V2:=V2+[j]
Soluia este de a genera ntr-un vector nodurile care aparin mulimilor V1, V2, astfel: dac un element
are valoare a 1, nodul care eticheta corspunztoare indicelui elementulului mulimii V1; altfel, aparine
mulimii V2.
Funcia gererare() genereaz grafurile bipartite complete. n vectorul a se genereaz nodurile mulimilor
V1 i V2. Iniial elementele vectorului auvaloarea 0. Variabila posibil se folosete pentru a verifica dac
mai exist posibilitile de generare de submulimi ( are valoare 1 atunci cnd mai este posibils se
genereze submulimile)
#include <conio.h>
#include <iostream.h>
#include<math.h>
void generare (int n)
{int a[20]={0},i,j,k=0,posibil=1;
while (posibil)
{j=n;
while(j>0&&a[j]==1) {a[j]=0;j--;}
if(j==0) posibil=0;
else
{a[j]=1; k++;
if(k<=pow(2,n)-2)
37
{cout<<"graful "<<k<<endl<< "Multimea V1:";
for(i=1;i<=n;i++) if(a[i]) cout<<i<<" ";
cout<<"Multimea V2:";
for(i=1;i<=n;i++) if(!a[i]) cout<<i<<" ";
cout<<endl;
cout<<"Muchiile sunt:";
for(i=1;i<=n;i++)
if(a[i]==1)
for(j=1;j<=n;j++)
if(a[j]==0&&i!=j) cout<<"["<<i<<","<<j<<"] ";
cout<<endl;}}}}

void main()
{ int n;
cout<<"numar de noduri="; cin>>n;
generare(n);
getch();}
Problema 4
4. Fie graful G cu n vrfuri, dat prin matricea de adiacen, ntr-un fiier text. S se realizeze un program
care precizeaz dac graful este bipartit.
Rezolvare: Pt. a verifica dac graful este bipartit, se genereaz mulimile de noduri V1 i V2 pn cnd
aceste mulimi ndeplinesc condiia unui graf bipartit, sau pn cnd s-au generat toate mulimile i nici
na dintre variante nu a ndeplinit condiia pt. graful bipartit ( ntre orice pereche de 2 elemente din cele 2
mulimi exist o muchie care s le lege n graf)
Se genereaz ntr-un vector toate submulimile care se pot obine din cele n etichete de noduri (exceptnd
mulimea iniial i cea vid) i se verific dac nodurile aparinnd celor 2 mulimi generate pot fi
mulimile unui graf bipartit.
Funcia bipartit() verific dac graful este bipartit furniznd un rezultat logic. Elementele vectorului x n
care se genereaz mulimile V1 i V2 sunt iniial 0. Variabila gasit se folosete pentru a verifica dac s-
au gsit cele dou mulimi de noduri corespunztoare unui graf bipartit ( are valoarea 1 atunci cnd s-au
gsit)
#include <conio.h>
#include <iostream.h>
#include <fstream.h>
#include<math.h>
int a[20][20],v[20],i,j,n,m,x;
ifstream f("gb.txt");
int bipartit()
{int x[10]={0},i,j,m,k=0,posibil=1,gasit=0;
while(posibil&&!gasit)
{m=n;
while(m>0&&x[m]==1) {x[m]=0;m++;}
if(m==0) posibil=0;
else
{x[m]=1; k++;
if(k<=pow(2,n)-2)
for(i=1,gasit=1;i<=n&&gasit;i++)
for(j=1;j<=n&&gasit;j++)
if(a[i][j]==1)
if((x[i]==1&&x[j]==1)||(x[i]==0&&x[j]==0))
gasit=0;}}
return gasit;}
void main()
{
f>>n;
while(f>>i>>j)
a[i][j]=a[j][i]=1;
f.close();
if (bipartit()) cout<<"este bipartit";
else cout<<"nu este bipartit";
getch();}

gb.txt
4
0 1 0 0
1 0 1 0
0 1 0 1
0 0 1 0
Problema 5.
S se gereze toate grafurile neorientate bipartite complete cu n noduri.
Rezolvare: problema se reduce la a genera toate submulimile care se pot obine din cele n elemente.
Numrul total de submulini obinut este 2
2
-2 (mai puin muimea iniial i mulimea vid). Soluia este
de a genera ntr-un vector nodurile care aparin muimilor V1 i V2, astfel: dac un elemnt are valaorea
1, nodul care are eticheta corespunztoare indicelui elementului aparine mulimii V1; altfel apaine
mulimii V2.
Funcia generare() genereaz nodurile mulimilor V1 i V2. Iniial elementele vectorului au valaorea 0.
Variabila posibil se folosete pentru a verifica dac mai exist posibiliti de generare de submulimi(are
valorea 1 cnd e posibil s se mai genereze submulimi)
include<iostream.h>
#include<conio.h>
#include<math.h>
38
void generare (int n)
{int a[10]={0},i,j,k=0,posibil=1;
while(posibil)
{j=n;
while(j>0&&a[j]==1) {a[j]=0;j--;}
if(j==0) posibil=0;
else{a[j]=1; k++;
if(k<=pow(2,n)-2)
{cout<<"graful"<<k<<endl<<"multimea V1: ";
for(i=1;i<=n;i++) if(a[i]) cout<<i<<" ";
cout<<endl;
cout<<"multimea V2:";
for(i=1;i<=n;i++) if(!a[i]) cout<<i<<" ";
cout<<endl;
cout<<"muchiile sunt: ";
for(i=1;i<=n;i++)
if(a[i]==1)
for(j=1;j<=n;j++)
if(a[j]==0&&i!=j) cout<<"["<<i<<","<<j<<"]";
cout<<endl;}}}}
void main()
{int n;
cout<<"numarul de noduri"; cin>>n;
generare(n);getch();}
7. Graf bipartit complet
Problema 1
a) Graful este bipartit, deoarece respect definiia, V1={ 1, 2, 3 }, V2={4, 5}, dar nu este complet,
deoarece exist noduri in V1 (ex. 2) nelegate de toate nodurile din V2 (ex. 5).
b) Graful este bipartit deoarece respect definiia, V1={ 1, 3}, V2={2, 4}, dar cum toate nodurile din V 1
sunt legate de toate nodurile din V2 nseamn c este bipartit complet.
Problema 2
Pentru a obine un graf bipartit complet trebuie adugat muchia [2,5]; V 1={ 1, 2, 3 } , V2={4, 5}.
Problema 3
Se procedeaz astfel:
Pe liniile l..p din matricea de adiacen
se pune valoarea 1 pe coloanele p+l..n, deoarece toate elementele din V 1 sunt
legate de toate elementele din V2
(nu trebuie uitat ca matricea de adiacen este simetric fa de diagonala principal)
........................
for (i=1;i<=p;i++)
for (j=p+l;j<=n:j++)
{ a[i][j]=1;
a[j][i]=1;}
.........................
Problema 4
Se procedeaz astfel:
Este suficient s gndim construirea matricei deasupra diagonalei principale, pentru c ea este simetric
fa de diagonala principal. Matricea se construiete astfel:
- pe liniile pare, de deasupra diagonalei principale,
se pune valoarea 1 pe coloanele impare, deoarece toate elementele din V 1 sunt
legate de toate elementele din V2
- pe liniile impare, de deasupra diagonalei principale, se pune valoarea 1 pe coloanele pare, deoarece
toate elementele din V2 sunt legate de toate elementele din V 1
(nu trebuie uitat ca matricea de adiacen este simetric fa de diagonala principal)
.........................
39
for (i=1;i<=n-l;i++)
for (j=i+l;j<=n;j++)
if ((i % 2==0) && (j % 2!=0})
{ a[i][j]=1;
a[j][i]=1;}
for (i=1;i<=n-l;i++)
for (j=i+1;j<n;j++)
if ((i % 2!=0) && (j % 2==0))
{ a[i][j]=1;
a[j][i]=1;}
.............................
Problema 5
Un graf bipartit complet este unic determinat de o partiie a lui V n doua submulimi V l i V2, disjuncte
i nevide. A determina toate grafurile bipartit complete, nseamn a determina n cte moduri se pot
construi mulimile V1 i V2. Pentru aceasta procedm astfel:
n mulimea V1 se pune nodul 1, pentru a nu repeta soluiile
(mai sunt n-1 noduri nepuse).
Partiia_1 la V1 se adaug 0 noduri (sunt
0
1 n
C situaii ) iar la V2 restul
Partiia_2 la V1 se adaug 1 noduri (sunt
1
1 n
C situaii ) iar la V2 restul
Partiia_3 la V1 se adaug 2 noduri (sunt
2
1 n
C situaii ) iar la V2 restul
......................................
Partiia_n-1 la V1 se adaug n-2 noduri (sunt
2
1

n
n
C situaii ) iar la V2 restul
(alte partiie nu mai exist, pentru c la Vl nu se pot aduga nc n-1 noduri deoarece V2 ar fi vid, n
acest caz , i ar fi n contradicie cu definiia grafului bipartit).
n total sunt
0
1 n
C +
1
1 n
C +
2
1 n
C +... +
2
1

n
n
C posibiliti de construire. Aceast sum se calculeaz astfel:
0
1 n
C +
1
1 n
C +
2
1 n
C +... +
2
1

n
n
C +
1
1

n
n
C =2
n-1
de unde rezult ca:
0
1 n
C +
1
1 n
C +
2
1 n
C +... +
2
1

n
n
C =2
n-1
-
1
1

n
n
C =2
n-1
-1

8. Reprezentarea grafurilor
Problema 1

a)
|
|
|
|
|
|

\
|
=
0 0 1 0 1
0 0 0 1 0
1 0 0 0 1
0 1 0 0 0
1 0 1 0 0
A
Vrful i Lista vecinilor lui
1 3,5
2 4
3 l, 5
4 2
5 1, 3
M={[e1[1],e2[1]]=[1,3],[e1[2],[2]]=
[1,5],[e1[3],e2[3]]=[2,4],[e1[4],e2[4]]=[3,5]}
b)
|
|
|
|
|

\
|
=
0 1 0 1
1 0 1 1
0 1 0 1
1 1 1 0
A
Vrful i Lista vecinilor lui
1 2,3,4
2 1,3
3 l, 2,4
4 1,3
M={[el[1],e2[1]]=[1,2], [el[2],e2[2]]=[1,3],
[el[3],e2[3]]=[1,4], [el[4],e2[4]]
=[2,3],[el[5],e2[5]]=[3,4]}
Problema 2
A verifica dac matricea poate reprezenta matricea de adiacen a unui graf neorientat, trebuie verificate
urmtoarele:
- matricea are pe diagonala principal numai elemente egale cu 0;
- matricea are deasupra diagonalei principale numai elemente de 0 i 1;
40
- matricea este simetric fa de diagonala principal.
................
ok1=1;
for (i=l;i<=n;i++)
if (a[i][i]!=0) ok1=0;
ok2=1;
for (i=1;i<=n-l;i++)
for (j=i+l;j<=n;j++)
if (!((a[i][j]==a) || (a[i][j]=1)) ok2=0;
ok3=1;
for (i=1;i<=n-l;i++)
for (j=i+l ;j<=n;j++)
if (a[i][j] !=a[j][i]) ok3=0;
ok=okl && ok2 && ok3;
cout<<ok;
......................
Problema 3
Un graf neorientat, cu n vrfuri, este unic determinat de o matrice de adiacen ptratic de ordinul n.
Deci, a determina grafurile neorientate cu n vrfuri nseamn a determina toate matricele ptratice de
ordinul n, caracterizate astfel:
- au numai elemente de 0 i/sau 1;
- pe diagonala principal an numai elemente de 0;
- sunt simetrice fa de diagonala principal.
Citind cu atenie caracteristicile matricei de adiacen, constatm cu uurin c pentru a determina o
astfel de matrice este suficient s-i determinm elementele de deasupra diagonalei principale, deoarece
matricea are deasupra diagonalei principale (n
2
-n)/2 elemente, problema se reduce la a determina toi
vectori de lungime (n
2
-n)/2 cu elemente de 0 i 1; aceti vectori sunt n numr de
( ) 2 /
2
2
n n
(este vorba de
determinarea submulimilor unei mulimi cu (n
2
-n)/2 elemente).
Problema 4
Problema se reduce la a determina toi vectori de lungime (n
2
-n)/2 cu elemente de 0 i/sau 1; (vezi
explicaiile de la problema anterioar). Acest lucru se face folosind metoda Backtracking, astfel:
- se genereaz pe rnd toi vectorii de lungime p=(n
2
-n)/2 cu elemente de 0 i/sau 1;
- pentru fiecare vector generat, se construiete matricea de adiacen corespunztoare, astfel:
- pe diagonala principal se pune 0;
- deasupra diagonalei principale se pun elementele vectorului, astfel:
ks=1;
for (i=1;i<=n-l;i++)
for (j=i+l ;j<=n;j++)
{a[i][j]=x[ks];
ks=ks+1;
a[j][i]=a[i][j];}
- elementele de sub diagonala principal trebuie puse astfel nct matricea s fie simetric
fa de diagonala principal.
n concluzie, trebuie generate elementele mulimii{(x
1,
x
2
,...,x
p
) | x
k
{0,1}, k=1,...,p}.
x=(x
1,
x
2
,...,x
p
) unde x
k
{0,1 }; k{ 1,...,p}; p=(n
2
-n)/2
#include <conio.h>
#include <iostream.h> p
#include <stdio.h>
typedef int sir[100];
sir x; k
int i, k, n, p;
int as, ev; 1
int a[100][1001; 0 1
void succ(sir x, int k, int &as) x
k

{if (x[k]<I)
0
0
.
0
0
1
1
.
1
1
41
{as=1;
x[k]=x[k]+l;}
else as=0;}
void valid( int &ev)
{ev=1;}
void afis(sir x)
{int i, j, ks; generarea matricei de adiacen,
ks=1; plecnd de la vectorul generat
for (i=1;i<=n-1;i++)
for (j=i+l;j<=n;j++)
{a[i][j]=x[ks];
ks=ks+1;
a[j][i]=a [i][j];}
for (i = 1 ;i<=n;i++) afiarea matricei de adiacen
{for (j=1;j<=n;j++)
cout<<a[i]]j]<< ;
cout<<endl;}
cout<<endl<<endl;}
void main()
{cout<<n=;cin>>n;
k=1;
x[k]=1; privii tabla
while (k>0) {
do{ succ(x,k,as);
if (as) valid(ev);
} while (as && !ev);
if (as)
if (k=p) afis(x);
else { k=k+ 1;
x[k]=1;}
else k=k-1;
}
}
Problema 5
Matricea de adiacen A2 reprezint un graf parial al grafului reprezentat de matricea de adiacen A1
dac acolo unde elementele matricei A1 sunt 0 i elementele corespunztoare din matricea A2 sunt 0; n
rest nu conteaz, adic, dac elementele lui A1 sunt 1 elementele corespunztoare din A2 pot fi 0 sau 1
(acest lucru se exprim astfel: A2[i,j]<=A1[i,j]). Este suficient s facem verificarea pentru elementul de
deasupra diagonalei principale.
................
ok=1;
for (i=l;i<=n-1;i++}
for (j=i+l;j<=n;j++)
if (!(A2[i][j]<=A1[i][j]) ok=0;
if (ok) cout<<"A2 reprezinta un graf partial al grafului reprezentat de A1";
else cout<<"A2 nu reprezinta un graf partial al grafului reprezentat de A1 ";
.....................
Problema 7
Un graf bipartit complet este unic determinat de o partiie a lui V n dou submulimi V1 i V2, distincte
i nevide. A determina toate grafurile bipartit complete, nseamn a determina toate modurile n care se
pot construi mulimile V1 si V2, din elementele {1 ...n}.
Acest lucru se realizeaz astfel:
n mulimea V1 se pune nodul 1, pentru a nu repeta soluiile (mai sunt n-1 noduri nepuse). Problema
revine la a determina toate posibilitile de a plasa vrfurile 2...n n prima sau n a doua mulime; orice
astfel de plasare convine cu excepia plasrii tuturor vrfurilor n prima mulime.
42
Pentru a rezolva aceast problem vom folosi metoda Backtracking, astfel:
Se genereaz toi vectorii:
x=(x
1
x
2
,...,x
n
) cu x
1
=1 i x
k
{0,1} pentru k{2,...,n}, fr ca toate elementele s fie egale cu 1, cu
urmtoarea semnificaie:
dac x
i
=1, atunci i face parte din V1 n
altfel i face parte din V2
#include <conio.h>
#include <iostream.h> k
#include <stdio.h>
typedef int sir[ 100];
sir x; 2
int i, k, n; int as, ev; 0 x
k
1
void succ(sir x, int k, int&as)
{if (x[k]<1)
{as=1;
x[k]=x[k]+1;}
else as=0;}
void valid( int &ev )
{ev=1;}
void afis(sir x, int k)
{int i, s;
s=0;
for (i=l;i<=k;i++) dac toate componentele
s=s+x[i]; se verific au valoarea 1
if (s!=n)
{cout<<"V 1:; din V1 fac parte numai elementele i
for (i=1;i<=n;i++) pentru care x
i
=l
if (x[i]==1) cout<<i<< ;
cout<<endl;
cout<<"V2 :; din V2 fac parte numai elementele i
for (i=1;i<=n;i++) pentru care x
i
=0
if (x[i]==0) cout<<i<< ;
cout<<endl<<endl;}
}
void main()
{ clrscr();
cout<<"n="; cin>>n;
x[1]=1;
k=2;
x[k]=-1; privii tabla
while (k> 1){
do{ succ(x,k,as);
if (as)
valid(ev);
}while (as && !ev);
if (as)
if (k==n) afis(x,k);
else
{k=k+ 1;
x[k]=-1;}
else k=k-1;
}
getche();}
Problema 8
0
0
.
0
0
1
1
.
1
1
43
Dup cum se vede n enunul problemei, graful se d prin precizarea numrului de noduri i a irului
muchiilor sale m
1
... m
p
. Plecnd de la faptul c un graf parial al su se obine prin eliminarea unui numr
oarecare de muchii, pstrnd aceeai muchie de vrfuri, problema dat se reduce la generarea
submulimilor mulimii {m
1
... m
p
}. Acest lucru l vom realiza folosind metoda Backtracking, astfel:
- se genereaz submulimile mulimii {m
1
... m
p
}
- pentru fiecare astfel de submulime generat, construim matricea de adiacen si o afim.
Se genereaz toi vectorii:
x=(x
1,
x
2
,...,x
p
) cu x
k
{ 0,1} pentru k{1,...,p} cu urmtoarea semnificaie: dac x
i
=0, atunci m
i
se
elimin din mulimea {m
1
... m
p
} altfel m
i
nu se elimin din mulimea {m
1
... m
p
}
#include <conio.h>
#include <iostream.h>
#include <stdio.h> p
typedef int sir[100];
typedef struct{
int x, y; } muchie; k
sir x;
int a[100][100];
int i, k, n, p, nr, j; 1
int as, ev; 0 x
k
1
muchie m[100];
void succ(sir x, int k, int &as)
{if (x[k]<l)
{as= 1;
x[k]=x[k]+1;}
void valid(int &ev)
{ ev=1;}
void afis(sir x, int k)
{ int i;
for (i=1;i<=k;i++)
if (x[i]==1)
{a[m[i].x][m[i].y]=1;
a[m[i].y][m[i].x]=1;} construirea matricei de adiacent
nr=nr+ 1 ;
cout<<"matricea de adiacenta al celui de-al "<<nr<<"-lea graf partial"<<endl;
for (i=1;i<=n;i++) afiarea matricei de adiacen
{for (j=1;j<=n;j++)
cout<<a[i][j]<< ;
cout<<endl;}
}
void main()
{ clrscr();
nr=0;
cout<<"n="., cin>>n;
cout<<"p="; cin>>p;
for (i=1;i<=p;i ++) cin>>m[i].x>>m[i].y;
k=1;
x[k]=- 1;
while (k>0){ priviti tabla
do {succ(x,k,as);
if (as) valid(ev);
}while (as &&!ev);
if (as)
if (k==p) afis(x,k);
else
{k=k+ 1;
0
0
.
0
0
1
1
.
1
1
44
x[k]=-1;}
else k=k-1;
}
getch();}

Problema 9
innd cont de faptul ca un subgraf al unui graf se obine prin eliminarea unui numr de noduri, i a
muchiilor incidente cu aceste noduri, tragem urmtoarea concluzie:
Problema se reduce la a genera toate submulimile mulimii {l, ..., n} (fr mulimea vid), iar pentru
fiecare submulime generat se afieaz dect acele muchii ale grafului care au ambele extremiti printre
elementele submulimii.
Rezolvarea problemei se face folosind metoda Backtracking, i const n a genera elementele mulimii:
{(x
1
,x
2
...,x
n
) I x
k
{0,1}, k=1,...,n, nu toate nule}.
(dac x
k
=1, nseamn c nodul k face parte din submulime, altfel nu)
x=(x
1
,x
2
,...,x
n
) unde x{0,1};
k{ 1,...,n);
#include <conio.h> n
#include <iostream.h>
#include <stdio.h>
typedef int sir [ 100]; k
typedef int mat[20[20];
int e l, e2; 1
int i,j,n,m,ns,k; mat a; 0 1
sir x; x
k
int as, ev;
void succ(sir x, int k, int &as)
{if (x[k)< 1)
{as= 1;
x[k]=x[k]+1;}
else as=0;}
void afis(sir x, int k)
{ int i;
ns=ns+1; ns este numrul soluiei
cout<<"subgraful cu numarul "<< ns<<"are nodurile "; curente
cout<<endl;
for (i=1;i<=k;i++)
if (x[i]==1) se afieaz nodurile
cout<<i<<" ", corespunztoare unei soluii
cout<<endl;
cout<<"si muchiile ";
for (i=1;i<=k-l;i++) se afieaz muchiile
for (j=i+l;j<=k;j++) corespunztoare unei soluii
if ((x[i]==1) && (x[j]==1) && (a[i][j]==1))
cout<<" (,<<i<<",<<j<<")<<endl;
cout<<endl<<endl;}
void valid(sir x, int k, int &ev)
{ int i, s;
ev=l;
if (k=n)
{ s=0; aici se elimin soluia
for (i=1;i<=k;i++) cu toate componentele
s=s+x[i]; egale cu 0
if (s==0) ev=0;}
}
void main()
0
0
.
0
0
1
1
.
1
1
45
{ clrscr();
cout<<"n="; cin>>n;
cout<<"m=; cin>>m;
for (i=1;i<=m;i++)
{cout<<"el e2 "; cin>>el>>e2;
a[el][e2]=1;
a[e2][e1]=1;}
ns=0;
x[1]=-1;
k=1;
while (k>0){
do{
succ(x,k,as);
if (as) valid(x,k,ev);
}while (as && !ev);
if (as)
if (k==n) afis(x,k);
else {
k=k+1 ;
x[k]=- 1;}
else k=k-1,
}
getch();}

Problema 10
Problema se reduce la:
- a ne imagina un graf neorientat, nodurile grafului sunt persoanele iar muchiile sunt reprezentarea
relaiilor de simpatie ntre persoane, care este reprezentat prin listele de adiacen (citite de la tastatur)
- a construi matricea de adiacen corespunztoare (plecnd de la listele de adiacen);
- a verifica proprietatea de simetrie fat de diagonala principal, adic: a[i][j]=a[j][i] , pentru 1i, j n.


#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int mat[20][20];
int i, j, n, vec;
mat a;
int ok;
void main()
{ clrscr(); c
out<<"n="; cin>>n;
for (i=1;i<=n;i++) se construiete matricea de adiacen plecnd de la listele
{cout<<"Pentru "<<i<<endl; de adiacenta
cout<<"dati numarul vecinilor";
cin>>vec:
for (k=l;k<=vec;k++)
{cin>>j;
a[i][j]=1;}
}
ok=1; se verific proprietatea de simetrie
for (i=1;i<=n-l ;i++)
for (j=i+l;j<=n;j++)
if (a[i][j]!=a[j][i])
{ok =0;
46
cout<<"nepotrivire intre "<<i<<" si<<j;}
if (ok) cout<<"toate simpatiile sunt reciproce",
getche(); }

9. Parcurgerea grafurilor

Problema 1
Listele nodurilor obinute n urma parcurgerii in lime:
a) 1, 3, 5, 4, 2;
b) l, 2, 3, 4, 6, 5;
Listele nodurilor obinute n urma parcurgerii n adncime:
a) 1, 3, 5, 4, 2;
b) 1, 2, 3, 4, 5, 6;
Problema 2
Aceast problem este, pn la urm, o problem de parcurgere a unui graf. Pentru a determina nodurile
care sunt accesibile din nodul 1, se procedeaz astfel:
- la nceput, nici un nod nu se consider vizitat;
- se viziteaz nodul 1;
- se aplic una dintre procedurile de parcurgere, de exemplu n adncime, plecnd de la nodul 1;
- se afieaz toate nodurile care au fost vizitate, n urma apelului procedurii de care am vorbit (aceste
noduri sunt, de fapt, nodurile la care se poate ajunge plecnd de la nodul 1).
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int sir [100;
typedef int mat[20][20];
int i, n, pl, m, x, y;
mat a;
sir viz;
void parc_adancime(int pl)
{ int j;
viz[pl]=l;
for (j=1;j<=n;j++)
if ((a[pl][j]==1) && (viz[j]==0))
parc_adancime(j);}
void main()
{ clrscr();
cout<<n m; cin>>n>>m;
for (i= l;i<=m;i++)
{cout<<"x y "; cin>>x>>y;
a[x][y]=1;
a[y][x]=1;}
for (i=1;i<=n;i++)
viz[i]=0;
p1=1;
parc adancime(pl);
cout<<" nodurile care sunt accesibile din nodul 1 sunt ";
for (i=1;i<=n;i++)
if (viz[i]==1) cout<<i<< ;
getche(); }

10. Conexitate

Problema1
Fiind date grafurile de mai jos:
47
a) l



b)
sa se precizeze pentru fiecare n parte un lan, un lan de lungime 4, un lan elementar, un ciclu, un
ciclu elementar, dou cicluri egale.

a) L1=[1, 3, 5 ] lan;
L2=[1, 3, 5, 4, 2] lan de lungime 4;
Oricare dintre lanurile de mai sus sunt
elementare.
C1=[1, 3, 5, 1] ciclu;
Ciclul de mai sus este elementar.
C1=[l, 3, 5, 1] este egal cu C2=[3, 5, 1, 3];
b)L1=[l, 2, 3, l, 4] lan;
L2=[4, 1, 2, 3, S] lan de lungime 4;
Lanul de mai sus este elementar.
Cl=[1, 2, 3, 1] ciclu;
Ciclul de mai sus este elementar.
C1=[l, 2, 3, 4, 1] este egal cu C2=[4, 3, 2, l, 4];

Problema 2
Fie G un graf neorientat, cu n noduri i m muchii. Precizndu-se doua noduri np (nodul de
plecare) i ns (nodul de sosire), s se determine toate lanurile elementare care le admit ca
extremiti.
Problema se rezolv folosind metoda Backtracking, i se reduce la a determina irurile de forma x
1
..... x
p

unde x
l
=np i x
p
=ns (deci, construcia unei solui se oprete atunci cnd o component a sa primete
valoarea ns), cu componente distincte, astfel nct ntre x
i
i x
i+1
s existe muchie n graful dat.
n concluzie, soluia este x=(x
1
x
2
,...,x
p
), unde x
1
=np, x
p
=ns, x
k
{1,...,n} k{2....,p-1}; x
i
x
j
pentru ij,
i a[ x
i-1
][x
i
]=1
Comentarii la functia Valid:
Trebuie verificat ca:
- exist muchie ntre nodurile x
k-1
i x
k
, adic trebuie verificat c a[ x
k-1
][x
k
]=1;
- nodul x
k
este diferit de toate nodurile prin care s-a trecut, adic:
xkx
i
pentru i=1...k-1.


#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int sir [ 100];
typedef int mat[20][20];
int e l, e2;
int i,j,n,m,ns,np,k;
mat a;
sir x;
int as, ev;
void succ(sir x, int k, int &as)
{if(x[k]<n)
{ as=1;
x[k]= x[k]+1;}
else as=0;}
void afis(sir x, int k)
{int i;
for (i=1;i<=k;i++)
cout<<x[i]<c ;
cout<<endl;}
void valid(sir x, int k, int &ev)
48
{ int i;
ev=1;
if (a[x[k-1]][x[k]]==0) ev=0; trebuie s existe muchie ntre
else x
k-1
si x
k

for (i=1;i<=k-l;i++)
if (x[k]==x[i]) ev=0;}
void main()
{ clrscr();
cout<<"n=": ciu>>n;
cout<<"m=; cin>>m;
for ( i=1;i<=m;i++)
{cout<<"el e2 "; cin>>el>>e2;
a[e1][e2]=1;
a[e2] [e1]=1;}
cout<<"np="; cin>>np;
cout<<"ns="; cin>>ns;
x[1]=np;
k=2;
x[k]=0;
while (k>1){
do{
succ(x,k,as);
if (as) valid(x,k,ev);
}while (as && !ev);
if (as)
{ if (k<=n)
if (x[k]=ns)
afis(x,k);
else
{k=k+ 1;
x[k]=0;}
}
else k=k-1;
}
getche(); }
Problema 3
Problema se rezolv folosind metoda Backtracking, astfel:
- se genereaz aranjamentele muiimii { 1,..., n} in vectorul x=(x
1
,x
2
,...,x
n1
) unde nl=n...2 (deci, se ncepe
cu generarea soluiilor cu lungimea cea mai mare);
- dintre vectorii generai, se aleg cei care verifica proprietate: ntre x
i
si x
i+1
exist muchie i se afieaz
cei cu lungimea cea mai mare (acest lucru estc ilustrat n functia Afis).
Comentarii la functia Afis:
- la primul apel al funciei (ns=l ) se pstreaz lungimea vectorului soluie (lung=k) pentru ca aceasta este
cea mai mare;
- la urmatoarele apeluri nu se ia in calcul dect vectorii cu lungimca egal cu lung
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int sir [ 100];
typedef int mat[20][20];
int el, e2; int i, j , n,n l, m , k, ns, lung;
mat a;
sir x; int as, ev;
void succ(sir x, int k, int &as)
{ if (x[k]<n)
{as=1;
x[k]=x[k]+1; }
else as=0;}
void afis(sir x, int k)
{ int i;
ns=ns+ 1;
if (ns==1) lung=k;
if (k==lung)
{for (i=1;i<=k,i++) cout<<x[i]<< ;
cout<<endl;}
49
}
void valid(sir x, int k, int &ev)
{int i; ev=1;
if (a[x[k-1]][x[k]]==0) ev=0;
else
for (i=1;i<=k-l;i++)
if (x[k]== x[i]) ev=0;
}
void main()
{ clrscr();
cout<<"n=; cin>>n; cout<<"m=; cin>>m;
for (i=1;i<=m;i++)
{cout<<"el e2 ";cin>>el>>e2;
a[e1][e2]=1;
a[e2][el]=1;}
ns=0;
for (n1=n;n1>=2;n1--)
{x[1]=0;
k=1;
while (k>0){
do{
succ(x,k,as);
if (as) valid(x,k,ev);
}while (as && !ev);
if (as)
if (k= nl) afis(x,k);
else
{k=k+ 1;
x[k]=0;}
else k=k-1;
}
}
getche();}


Problema 4
Dac ar exista un ciclu de lungime 4 ar fi de forma: i, kl, j, k2, i. Pentru a demonstra existena unui astfel
de ciclu, procedm astfel:
- ncercm s artm c pentru o pereche de noduri (i, j) exist alte dou noduri kl i k2 diferite de acestea
i legate de ele prin muchii (a[i,kl]=1, a[j,kl]=1 i a[i,k2]=1, a[j,k2]=1)
....................
ok=0;
for (i=1;i<=n-l;i++)
for (j=i+l ;j<=n;j++)
nr =0;
for (k=1;k<=n;k++)
if ((i!=k) && (j!=k) && (a[i][k]==1) && (a[j][k]==1)
nr=nr+ 1;
if (nr>= 2)
ok=1;}
.....................

Problema 5
Problema se rezolv folosind metoda Backtracking, i se reduce la a determina irurile de forma x
1
...,x
p

unde:
-x1=1
-componentele sunt distincte;
- ntre x
i
i x
i+1
i=1...p-1, s existe muchie n graful dat;
- x
1
i x
p
sunt unite printr-o muchie.
n concluzie, soluia este x=(x
1
,x
2
,....x
p
), unde x
1
=1, x
k
{2,...,n} k {2,...,p};
x
i
x
j
pentru ij, a[ x
i-1
x
i
]=1 pentru i=2..p, i a[ x
1
,x
p
]=1

#include <conio.h>
#include <iostream.h>
#include <stdio.h>
typedef int sir[100];
typedef int mat[20][20];
int e 1., e2;
int i, j, n, m, p, k;
mat a;
sir x;
int as, ev;
void succ(sir x, int k, int &as)
{if (x[k]<n)
{as=1;
x[k]=x[k]+1;}
else as=0;}
void afis(sir s, int k)
{int i;
for (i=1;i< =k;i++) cout<<x[i]<< ;
1...i
n
1...k
1
k
2
...n
i... j
n
50
cout<<x[1]<< " ;
cout<<endl;}
void valid(sir x, int k, int &ev)
{int i;
ev=1;
if (a[x[k-1]][x[k]]==0) ev=0;
else
{for (i=1;i<=k-l;i++)
if (x{k{==x[il) ev=0;
if ((k==p) && (a[ x[ k]][ x[1]]==0))
ev=0;}
}
void main()
{ clrscr();
cout<< " n="; cin>>n;
cout<<m="; cin>>m:

for(i=1;i<=m;i++)
{cout<<"el e2 "; cin>>el>>e2;
a[el][e2]=1;
a[e2][e1]==1;}
cout< <p=; cin>>p;
x[1]=1;
k=2;
x[k]=1;
while (k>1) {
do{
succ(x,k,as );
if (as) valid(x,k,ev);
}while (as && !ev);
if (as)
if (k==p) afis(x,k);
else
{k=k+ l ;
x[k]=l;}
else k=k-1;
}
getche();}



Problema 6
Pn la urm, este o problem de parcurgere a unui graf i se rezolz astfel:
- se citete matricea de adiacen;
- toate nodurile se consider iniial nevizitate;
- la nceput, sunt 0 componente conexe;
- se parcurg nodurile grafului
- dac se gsete un nod nevizitat nc
- nseamn ca s-a mai gsit o component conex
- i se viziteaz toate nodurile la care se poate ajunge plecnd fie la acest nod (pentru
aceasta este nevoie de una dintre procedurile de parcurgere a unui graf (n adncime sau n
lime))

#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int viz[ 100],a[20][20], i,n,m,x,y,nr,j;
void parc_adancime(int pl)
{int j;
viz[pl]=1;
for (j=1;j<=n;j++)
if ((a[pl][j]==1) && (viz[j]==0))
parc_adancime(j);}
void main()
{ clrscr();
cout<<"n="; cin>>n; cout<<"m"; cin>>m;
for (i=1;i<=m;i++)
{cout<<"x y"; cin>>x>>y;
a[x][y]=1;
a[y] [x]=1;}
for (i=1;i<=n;i++) viz[i]=0;
nr=0;
for (i=1;i<=n;i++)
if (viz[i]==0)
{nr=nr+1;
parc_adancime(i);}
cout<<"are "<<nr<<" componente conexe";
getche();}

Problema 7
Se procedeaz astfel:
- se citete matricea de adiacent;
- toate nodurile se consider iniial nevizitate;
- se parcurg nodurile grafului
- dac se gsete un nod nevizitat nc,
- se viziteaz si se afiseaz:
-se viziteaz i se afieaz toate nodurile la care se poate ajunge plecnd de la acest nod
51
(acest lucru se realizeaz printr-un apel ai procedurii parc_adancime).
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int viz [ 100],a[20][20],i,n,m,x,y,nr;
void parc_adancime(int pl )
{int j;
viz[pl]=1; cout<<pl<<" ";
for (j =1;j<=n;j++)
if ((a[pl][j]==1) && (viz[j]==0))
parc_adancime(j);}
void main()
{ clrscr(); cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
for (i=1;i<=m;i++)
{cout<<" x y"; cin>>x>>y;
a[x][y]=1;
a[y][x]=1;}
for (i=1;i<=n;i++) viz[i]=0;
nr=0;
for (i=1;i<=n;i++)
if (viz[i]==0)
{nr=nr+ 1 ;
cout<< " componenta conexa cu numarul" <<nr <<" are
nodurile"<<endl;
parc_adancime(i);
cout<<endl;}
getche( );


Problema 8
Problema se reduce, pn la urm, la a afia toate perechile de forma (il, i2), unde il si i2 sunt noduri din
aceeai compunent conex pentru aceatsta:
- se genereaz toate componentele conexe:
- pentru fiecare componet conex generat, se afieaz toate perechile ordonate de noduri (il,i2), care se
pot forma cu elementele sale.
Observaie. Pentru a nu ncurca nodurile care fac parte din componente conexe diferite, astfel nct s
afim de dou ori aceleai noduri, procedm astfel:
- dup ce se afieaz perechile formate din nodurile unei componente conexe, se mresc cu 1 toate
elementele din vectorul viz, care corespund nodurilor componentei afiate, pentru a deveni 2, astfel nct
s nu fie confundate cu modurile componentei conexe care se va determina, pentru care vectorul viz va
avea valoarea 1.
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
int viz[100],a[20][20], i,n,m,x,y,i1,i2;
void parc_adancime(int pl)
{int j; viz[pl]=1;
for (j=1 ;j<= n;j++)
if ((a[pl][j]==1) && (viz[j]==0))
parc_adancime(j);}
void main()
{ clrscr();
cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
for (i=1; i<=m; i++)
{cout<<"x y"; cin>>x>>y;
a[x][y]=1;
a[y][x]=1;}
for (i=1;i<=n;i++) viz[i]=0;
for (i=1;i<=n;i++)if (viz[i]==0)
{ parc_adancime(i);
for (i1=1;i1<=n-1;i1++)
for (i2=i1+1 ; i2<=n; i2++)
if ((viz[i1]==1) && (viz[i2]==1))
cout<<"("<<i1<<","<<i2<
<")";
for (i1=1;i1<=n;i1++)
if (viz[i1]==1) viz[i1]=viz[i1]+1;
cout<<endl;}
getche();}

Problema 9
Sistemului de culoare i se pune n coresponden un graf neorientat, astfel:
- nodurile grafului sunt culoarele;
- muchiile grafului sunt legturile ntre culoare.
A verifica dac toate culoarele fac parte din aceeai peter, nseamn a verifica dac graful asociat este
conex (adic este format dintr-o singur component conex):
- la nceput, nodurile sunt nevizitate;
- se aplic funcia de parcurgere a grafului, plecnd de la un nod oarecare;
- dac, dup parcurgere, n graf mai sunt noduri nevizitate, nu este conex;
(Vezi problema rezolvat din seciunea 10)
52
cout<<"dati nodul de plecare pare adancime(pl);
ok=0;
for (i=1;i<=n;i++)
if (viz[i]==0) ok=1;
if (ok) cout<<"sunt mai multe pesteri";
else cout<<"este o singura pestera";

Problema 10
Grupului de persoane, despre care se vorbete i se pune n coresponden un graf neorientat, astfel:
- nodurile grafului sunt persoanele;
- muchiile grafului sunt precizrile ideii c dou persoane sunt prietene (n mod direct).
A determina grupurile de persoane, cu un numr maxim de membri, ntre care se pot stabili prietenii,
directe sau indirecte, se reduce la a detennina componentele conexe cu cele mai multe noduri (este o
problem de maxim). Acest lucru se realizeaz astfel:
- pe msur ce se determin componenta conex, cu numrul nr,
- se determin numrul de noduri ale sale n comp[nr] i i se pstreaz nodurile n mulimea varfuri[nr]
- dac comp[nr]> max (max - cel mai mare numr nregistrat pn n prezent) devine max
- se afieaz nodurile tuturor componentelor conexe care au max noduri.
Atenie! Funcia parc_adancime are un parametru n plus (nr), pe care l folosete n scopul de a diferenia
elementele diferitelor componente conexe, astfel:
- la fiecare apel, elementele care au fost vizitate sunt marcate cu nr (viz[i]=nr).

#include <conio.h>
#include <iostream.h>
#include <stdio.h> t
typedef int sir [ 100];
typedef int mat[20][20];
mat a;
sir viz, comp;
int i, n , m , x, y, max,j, nr;
mat varfuri;
void parc_adancime(int pl, int nr)
{ int j;
viz[pl]=nr;
for (j=1;j<=n;j++)
if ((a[pl][j]==1) && (viz[j]==0))
parc_adancime(j,nr);}
void main()
{ clrscr();
cout<<"n="; cin>>n;
cout<<"m="; cin>>m;
for (i=1;i<=m;i++)
{ cout<<"x y"; cin>>x>>y;
a[x][y]=1;
a[y][x]=1;}
for (i=1;i<=n;i++) viz[i]=0;
max=0; nr=0;
for (i=1;i<=n;i++)
if (viz[i]==0) { nr=nr+ 1;
parc_adancime(i,nr);
comp[nr]=0;
for(j=1;j <=n;j++)
if (viz[j]==nr)
{ comp[nr]=comp[nr]+1;
varfuri[nr][comp[nr]]=j;}
if (comp[nr]>max)
max=comp[nr];}
for (i=1;i<=nr;i++)
if (comp[i]==max)
{ cout<<i<<":::::";
for (j=1;j<=comp[i];j++)
cout<<varfuri[i][j]<<" ";
cout<<" ";}
getch();
}
11. Cicluri Hamiltoniene
Problema 1
L=[1, 3, 5, 4, 2]: este lan hamiltonian;
C=[5, 4, 2, 3, 1, 5] : este ciclu hamiltonian;
Problema 2
Dac n3 i d(x)n/2 pentru orice nod x, atunci graful este hamiltonian.
........................
int grad(int i)
{int s, j;
s=0;
for (j=1;j<=n;j++)
53
s=s+a [i][j];
return s;}
.........................
ok 1=( n>=3 );
ok2=1;
for (i=1;i<=m;i++)
if (! (grad(i)>=n/2)) ok2=0;
ok==ok 1 && ok2;
if (ok) cout<<"se verifiica conditiile teoremei ";
else cout<<"nu se verifica conditiile teoremei";
..........................
Problema 3
Demonstrm acest lucru folosind metoda induciei matematice. Pentru a uura scrierea, vom nota cu H(n)
numrul ciclurilor hamiltoniene ale grafului K
n
n baza acestei notaii, enunul problemei care s
demonstrm c: ( )
( )
3
2
! 1

= n
n
n H
I. Verificare:
Pentru n= 3 ( ) ( )
( )
1
2
! 2
2
! 1 3
3 = =

= = H n H (adevrat, pentru c ntr-un graf complet cu trei vrfuri este


un singur ciclu hamiltonian)
II. Demonstratia P(n) P(n+ l )
(n_1)!
P(n) : ( )
( )
2
! 1
=
n
n H
P(n+l) : ( )
( )
2
! 1 1
1
+
= +
n
n H
Altfel spus, dac se tie c numrul ciclurilor hamiltoniene n graful K
n
este (n-1)!/2, s se demonstreze
c numrul ciclurilor harniltoniene n K
n+1
este n!/l.
Avnd la baz faptul c din fiecare ciclu hamiltonian din K
n
se pot obine n cicluri hamiltoniene distincte
n K
n+1
prin intercalarea nodului n+l n toate cele n locuri posibile (ntre dou noduri succesive; ex: x
1
x
2

... x
n
x
1
(ntre x
1
x
2
, x
2
x
3
, ..)), putem spune c n K
n+1
sunt n ori numrul ciclurilor din K
n
cicluri
hamiltoniene, ceea ce ne permite s scriem:
( ) ( )
( ) ( ) ( )
2
! 1 1
2
!
2
! 1
1
+
= =

= = +
n n n
n n H n n H
Problema 4
Avnd la baz:
1) fiecare ciclu elementar este un ciclu hamiltonian in subgraful complet indus de vrfurile sale i invers,
fiecare ciclu hamiltonian dintr-un subgraf cu k vrfuri este ciclu elementar n G.
2) ntr-un graf complet cu k vrfuri sunt
( )
2
! 1 k
cicluri hamiltoniene;
3) ntr-un graf cu n vrfuri pot exista
k
n
C subgrafuri cu k noduri:
tragem concluzia:
ntr-un graf cu n vrfuri, numrul ciclurilor elementare este egal cu:
( ) ( ) ( ) ( )
( )
( )
( )
( )
( ) ( )


=
= = =
+
=

+ +

n
k
n
k
n
k
n
k
k
n
n
n n n
k
k n n n
k
k n k k
n k
k n k
n k
C
n
C C C
3
3 3 3
4 3
1 ... 1
2
1
2
! 1
! )! 1 (
!
2
! 1
! !
!
2
! 1
2
! 1
...
2
! 1 4
2
! 1 3

Problema 5
Problema se face la fel ca i problema determinrii ciclurilor hamiltoniene, pe care am prezentat-o n
seciunea 11., numai c n situatia de fa, va trebui ca n loc s se afieze ciclurile s se dea rspunsul da
sau nu. Acest lucru se poate face astfel:
54
Se folosete o variabil boolean ok, care la nceputul programului are valoarea false (se presupune ca nu
exist cicluri), iar n procedura de afiare s primeasc valoarea true (adic s-a gsit un ciclu hamiltonian;
eventual, la primul apel al procedurii Afis s se renune la generarea ciclurilor care ar mai putea fi gsite)
i s se afieze nainte de terminarea programului.
Altfel:
Se procedeaz la fel ca la problema 2 (adic, se verific dac sunt satisfcute condiiile teoremei
prezentat n seciunea 11)
Problema 6
Asociem grupului de persoane, despre care se vorbete n enunul problemei, graf neorientat definit astfel:
nodurile grafului reprezint persoanele iar muchia ntre nodurile i i j reprezint precizarea ideii c
persoanele i i j sunt prietene, adic n relaie de nedumnie. Din ipoteza c fiecare cavaler are cel mult
(n-1) dumani, rezult c pentru fiecare cavaler exist cel puin 2n-(n-1)=(n+1)2n/2 cavaleri cu care
acesta se afl n relaie de nedumnie, adic de prietenie. innd cont de cele spuse mai sus, putem trage
concluzia c n graful asociat grupului de persoane sunt veriticate condiiile teoremei prezentat n
seciunea 11. conform creia n graful respectiv exist cel puin un ciclu hamiltonian. Ciclului
hamiltonian i asociem o aezare a cavalerilor la masa rotund n condiiile cerute.

Вам также может понравиться