Documente Academic
Documente Profesional
Documente Cultură
Carte Algoritmi Partea1 20 12 04
Carte Algoritmi Partea1 20 12 04
_______________________________________________________________________________
CUPRINS
BAZELE ALGORITMILOR
Introducere
Descrierea Algoritmilor
-algoritm, program, programare
-scheme logice
-limbajul Pseudocod
-calculul efectuat de un algoritm
-rafinare in pasi succesivi
-probleme propuse
-test
Subalgoritmi
-conceptul de subalgoritm
-apelul unui subalgoritm
-elaborarea algoritmului
-proiectarea ascendenta si descendenta
-proiectarea modulara
-apel recursiv
-programare structurata
-probleme propuse
-test de verificare
Limbajul Pascal
-mediul de programare Turbo Pascal
-programe pascal simple
-subprograme
-tipuri de date
-probleme propuse
-test de verificare
STRUCTURI DE DATE
Introducere
Lista simplu inlantuita
Teorie generala
-definitia componentelor listei
-metoda statica
-metoda dinamica
-operatii specifice listei
Test de verificare
Lista dublu inlantuita
Teorie generala
-definitia componentelor listei
________________________________________________________________________________
1
COMPLEXITATEA ALGORITMILOR
-etapele rezolvarii unei probleme
-notiune de algoritm si de program
-modelul abstract al masinii Turing
-teza Turing-Church
-analiza , proiectarea si implementarea algoritmilor
-operatia de baza cheia studiului complexitatii
-clase de algoritmi
-eficienata algoritmi
________________________________________________________________________________
2
TEHNICI DE CAUTARE
Cautare secventiala
Teorie generala
-descrierea generala a metodei
-descrierea algoritmului in pseudocod
-implementarea algoritmului in Pascal
-implementarea algoritmului in C
-performanta metodei de cautare
Probleme rezolvate
Probleme propuse
Simularea metodei de cautare
Cautare binara
Teorie generala
-descrierea generala a metodei
-descrierea algoritmului de cautare in Pseudocod
-implementarea algoritmului in Pascal
-implementarea algoritmului in C
-performanata metodei de cautare binara
Probleme rezolvate
Probleme propuse
Simularea metodei de cautare binara
Test de verificare
Arbori
________________________________________________________________________________
3
TEHNICI DE SORTARE
Istoric
Prezentare generala
BubleSort
-descrierea generala metodei
-implementarea algoritmului in Pascal si C
-complexitatea algoritmului
-probleme rezolvate
-probleme propuse
-simulare
-test de verificare
SelectionSort
-descrierea generala metodei
-implementarea algoritmului in Pascal si C
-complexitatea algoritmului
________________________________________________________________________________
5
________________________________________________________________________________
6
TEHNICI DE PROGRAMARE
Backtracking
Greedy
Programarea dinamica
Branch&Bound
Test de verificare
Exemple
Introducere
________________________________________________________________________________
7
________________________________________________________________________________
8
I. BAZELE ALGORITMILOR
I.1. DESCRIEREA ALGORITMILOR
________________________________________________________________________________
9
________________________________________________________________________________
10
________________________________________________________________________________
11
________________________________________________________________________________
13
________________________________________________________________________________
15
________________________________________________________________________________
16
________________________________________________________________________________
17
________________________________________________________________________________
18
________________________________________________________________________________
20
________________________________________________________________________________
21
________________________________________________________________________________
22
Exemplul I.10
ALGORITMUL DISTINCT ESTE: { Versiunea 3 }
CITETE n, (x[i], i=1,n);
FIE y[1]:=x[1]; k:=1;
PENTRU i:=2;n EXECUT
FIE r:=0; j:=1;
CTTIMP (r=0) i (j<=k) EXECUT
DAC x[i]=y[j]
ATUNCI r:=1;
ALTFEL j:=j+1;
SFDAC
SFCT
DAC r=0
ATUNCI k:=k+1; y[k]:=x[i];
SFDAC
________________________________________________________________________________
24
________________________________________________________________________________
25
Exemplul I.12
S considerm funcia numar : R {2,3,4,5}, definit matematic astfel:
________________________________________________________________________________
29
= r.
Pentru rezolvarea ecuaiei generale f (x) = 0 exist mai multe metode. Alegem pentru
rezolvare metoda coardei i a tangentei.
Aceast metod const n micorarea repetat a intervalului [a,b] care conine rdcina r
cutat, la intervalul [a',b'], aa cum se poate vedea n Figura 1.2. Variabilele folosite n descrierea
algoritmului sunt:
a i b, reprezentnd capetele intervalului n care se afl rdcina;
r mijlocul intervalului (a,b) n momentul n care b-a < eps, deci valoarea cutat.
________________________________________________________________________________
33
________________________________________________________________________________
34
________________________________________________________________________________
35
{noscuta x[j]}
________________________________________________________________________________
36
________________________________________________________________________________
37
________________________________________________________________________________
38
________________________________________________________________________________
39
Modulele se pot refolosi ori de cte ori avem nevoie de ele. Astfel, s-a ajuns la
compilarea separat a subprogramelor i la pstrarea subprogramelor obinute n
biblioteci de subprograme, de unde ele se pot refolosi la nevoie. Sunt cunoscute
astzi multe astfel de biblioteci de subprograme. Reutilizabilitatea acestor
subprograme este o proprietate foarte important n activitatea de programare. Ea
duce la mrirea productivitii n programare, dar i la creterea siguranei n
realizarea unui produs corect.
Una din activitile importante n realizarea unui program este verificarea corectitudinii
acestuia. Experiena a artat c modulele se pot verifica cu att mai uor cu ct sunt mai mici.
Abilitatea omului de a nelege i analiza corectitudinea unui subalgoritm este mult mai mare pentru
texte scurte. n unele cri chiar se recomand a nu se folosi subalgoritmi mai mari dect 50 de
________________________________________________________________________________
40
________________________________________________________________________________
41
________________________________________________________________________________
42
________________________________________________________________________________
43
________________________________________________________________________________
46
________________________________________________________________________________
47
t c
< 0.00001;
FIE r:=(c+t)/2
SF-coarda
SUBALGORITMUL juma(a,b, r, f,f1) ESTE: {Se rezolv prin metoda njumtirii}
{ecuaia f(x)=0, care are o rdcin n [a,b]}
{r= rdcina obinut, iar f1 este derivata lui f}
REPET
r:=(a+b)/2;
DAC f(a)*f(r) <0 ATUNCI
b:=r
ALTFEL
a:=r
SFDAC
PNCND
ba
SF-juma
SUBALGORITMUL Rezec(a,b, r, f,f1, met) ESTE:
CHEAM met(a,b,r,f,f1);
SF-Rezec
ALGORITMUL pffunctii ESTE: {Algoritmul 3.8}
________________________________________________________________________________
48
________________________________________________________________________________
49
n!
________________________________________________________________________________
50
________________________________________________________________________________
51
________________________________________________________________________________
52
Complexitatea algoritmilor
Etapele rezolvrii unei probleme
Este cunoscut faptul c rezolvarea unei probleme presupune n principal trei etape:
I.
II.
Analiza problemei
Proiectarea soluiei
III.
________________________________________________________________________________
53
generalitate: trebuie s rezolve problema pentru orice date de intrare din domeniul
precizat;
Ultima proprietate trebuie nuanat, avnd n vedere faptul c memoria oricrui calculator
este limitat. Nu ntotdeauna operaiile aritmetice se efectueaz exact, n unele cazuri obinndu-se
o aproximare a rezultatelor. Exist i soluii propuse pentru respectarea acestei proprieti, care
presupun implementarea software a operaiilor elementare cu numere ntregi (Fortune. et al.
[1993]), dar acestea duc la scderea vitezei de prelucrare. De aceea, abordri recente iau n
considerare modelul bazat pe aritmetica n virgul mobil, implementat pe toate calculatoarele
actuale (Shewchuk [1997]).
Avnd un algoritm care rezolv o problem dat, urmeaz s determinm resursele acestuia
(Livovschi i Georgescu, [1986]). Concret, de ct memorie i timp avem nevoie ca s obinem
soluia problemei? n acest scop facem urmtoarele simplificri: fiecare operaie elementar a
algoritmului se execut ntr-o unitate de timp, informaiile despre un obiect elementar se
memoreaz ntr-o locaie de memorie.
________________________________________________________________________________
56
Cea mai general problem NP-complet este problema satisfiabilitii: fiind dat o expresie
logic n forma normal conjunctiv cu n variabile, s se determine dac pot fi atribuite valori
logice variabilelor astfel nct expresia s fie adevrat Cook [1970].
Complexitatea medie. Considerm un algoritm care proceseaz n valori date la intrare.
Pentru o anumit configuraie a valorilor, probabilitatea configuraiei fiind pi, sunt necesare fi(n)
pi f i n .
operaii. Complexitatea medie a algoritmului este o sum ponderat:
i
Exemplul 1.1. Algoritmul Quick-sort necesit un timp de ordin O(n log n) n majoritatea cazurilor
pentru a ordona un ir de n valori. Exist ns cteva configuraii (foarte puine) care au nevoie de
un timp de ordin O(n2) pentru a fi procesate. Complexitatea medie a acestui algoritm este de ordin
O(n log n) Knuth [1976]:
________________________________________________________________________________
57
________________________________________________________________________________
59
________________________________________________________________________________
60
________________________________________________________________________________
61
________________________________________________________________________________
63
________________________________________________________________________________
64
________________________________________________________________________________
65
________________________________________________________________________________
66
________________________________________________________________________________
67
________________________________________________________________________________
68
Un program Pascal const dintr-un titlu, o parte de declaraii i instruciunile care formeaz
programul principal. El are urmtoarea structur general:
<program> ::= <antet_program> ; <bloc> .
unde
<antet_program> ::= PROGRAM <id> [ ( <lista_id> ) ]
iar
<bloc> ::= <lista_decl> ; <ins_compus>
Construciile <lista_decl> i <ins_compus> vor fi complet nelese puin mai trziu, dup
ce se vor prezenta declaraiile i instruciunile limbajului Pascal. n general prin lista de elemente
<lista_e> se nelege un simplu element <e>, sau o succesiune de elemente
<lista_e> ::= <e> { s <e> }
unde separatorul s este virgula sau uneori caracterul ';', caz n care vom meniona acest
lucru.
n definiia blocului elementul <decl> este metasimbolul folosit pentru declaraia Pascal
________________________________________________________________________________
71
________________________________________________________________________________
73
________________________________________________________________________________
74
Semnificaia lui x o y
adunare
scdere
nmulire
DIV
/
MOD
mprire ntreag
mprire real
Restul mpririi ntregi a lui x la y
Tab.1.3. Operaiile tipului INTEGER
Operaiile definite ntre valori de tip ntreg sunt +, -, *, DIV, MOD i /, iar semnificaia lor
se d n Tabelul 1.3. Uneori, - se noteaz i o operaie unar. Prin -x se nelege opusul lui x fa de
operaia de adunare.
1.3.3.5. Tipul real
Tipul real reprezint o submulime finit de numere reale aflate n intervalul [-vmax,
vmax], submulime care depinde de modul de reprezentare a numerelor reale n calculatorul folosit.
Deci vmax este o constant real care difer de la un calculator la altul, dar nu e o constant
predefinit ca MAXINT n cazul tipului INTEGER.
Operaiile definite ntre valori de tip real sunt adunarea, scderea, nmulirea i mprirea,
notate prin +, -, *, respectiv / . De remarcat c aceste operaii sunt definite i cnd un operand este
ntreg iar cellalt real, rezultatul fiind real, datorit conversiei implicite a tipului ntreg la real.
Menionm c n reprezentarea oricrui numr real n calculator se rein un numr finit de
cifre semnificative. Din aceast cauz rezultatul unei operaii cu numere reale este aproximativ.
Pentru a nelege exact aceste afirmaii este necesar cunoaterea reprezentrii numerelor n
calculator.
1.3.3.6. Tipul boolean
Domeniul tipului boolean const din mulimea valorilor logice "fals" i "adevrat", marcate
prin constantele FALSE, respectiv TRUE. Ordinea este FALSE < TRUE.
________________________________________________________________________________
75
________________________________________________________________________________
77
Semnificaia
abs(i)
abs(x)
sqr(i)
Ptratul ntregului i
sqr(x)
int(x)
trunc(x)
round(x)
frac(x)
exp(x)
sin(x)
sinusul lui x
cos(x)
cosinusul lui x
arctan(x)
ln(x)
sqrt(x)
succ(i)
pred(i)
ord(e)
chr(i)
odd(i)
________________________________________________________________________________
78
________________________________________________________________________________
80
________________________________________________________________________________
81
________________________________________________________________________________
84
________________________________________________________________________________
85
________________________________________________________________________________
88
TO
DOWNTO
c1
vi = vf
vi >= vf
c2
v < vf
v > vf
c3
v >=vf
v <= vf
________________________________________________________________________________
89
SUCC(v)
PRED(v)
________________________________________________________________________________
90
________________________________________________________________________________
92
________________________________________________________________________________
93
________________________________________________________________________________
94
________________________________________________________________________________
95
________________________________________________________________________________
96
Exemplul 25:
Algoritmul n Pseudocod este urmtorul:
ALGORITMUL NUMR_ZILE ESTE:
CITETE zi, luna, an;
FIE nr := zi;
DAC luna > 1 ATUNCI
PENTRU i := 1, luna-1 EXECUT
nr := nr + NRZILE(i)
SFPENTRU
SFDAC
DAC luna > 2 ATUNCI
DAC BISECT(an) ATUNCI
nr := nr + 1
SFDAC
SFDAC
TIPRETE nr;
SFALGORITM
Programul Pascal corespunztor este urmtorul:
PROGRAM APELFUNCTIE; { Programul 4.7 Exemplu de funcii Pascal}
VAR zi, luna, an, { Aceste variabile conin data curent }
nr: INTEGER; { nr va fi rezultatul cerut }
FUNCTION NRZILE(i: INTEGER): INTEGER; {Furnizeaza numarul zilelor}
{lunii cu numarul i}
BEGIN
CASE i OF
2: NRZILE := 28;
4, 6, 9, 11: NRZILE := 30;
1, 3, 5, 7, 8, 10, 12: NRZILE := 31
END {CASE}
END; {Nrzile}
________________________________________________________________________________
97
________________________________________________________________________________
98
________________________________________________________________________________
99
________________________________________________________________________________
100
________________________________________________________________________________
101
________________________________________________________________________________
102
________________________________________________________________________________
103
________________________________________________________________________________
104
________________________________________________________________________________
105
________________________________________________________________________________
106
________________________________________________________________________________
107
{ apoi elementul n }
end
else
Writeln
end;
________________________________________________________________________________
108
TipInvers(A, n-1)
end
{n-1 elemente}
end;
Function Max2l(a, b: Telem): Telem; {Max2(a,b) = cel mai mare dintre a si b }
Begin
If a > b then Max2 := a else Max2 := b
end;
Function Maxim(A:Sir; n:byte): Telem; {Elementul maxim }
Begin
{Elementul minim }
Begin
________________________________________________________________________________
109
end;
Begin
then PozMax := 1
else
PozMax:= PozMax2(n, PozMax(A, n-1))
end;
{maxim}
din primele n-1}
Function PozMin(A: Sir; n: byte): Tel; {Poziia elementului minim din irul A cu n
elemente}
Function PozMin2(i, j: byte): byte;
Begin
If a[i] < a[j] then PozMin2 := i else PozMin2 := j
end;
Begin {PozMin}
If n = 1 then PozMin := 1
else PozMin := PozMin2(n, PozMin(A, n-1))
end;
Function Exista(A: Sir; n: byte; x: Telem): Boolean;
Begin {x apartine A?: x=A[n] sau x exist n primele n-1}
Exista := (n > 0) and ((x = a[n]) or Exista(A, n-1, x))
________________________________________________________________________________
110
end;
Begin
Randomize;
n := Random(20) + 10; Genereaza(A, n);
Tipareste(A, n); Writeln;
TipInvers(A, n);
Writeln('Maximul = ', Maxim(A, n));
Writeln ('Minimul = ', Minim(A, n));
Writeln ('Poz_Max = ', PozMax(A, n));
Writeln ('Poz_Min = ',PozMin(A,n));
Randomize; x := Random(100);
If Exista(A, n, x)
then Writeln('In sir exista el. ', x)
________________________________________________________________________________
111
________________________________________________________________________________
113
Nota
10
..........................
25
________________________________________________________________________________
114
10
...
Elementele unui tablou pot fi la rndul lor tablouri. Astfel, elementele unui tablou de tipul
array[1..10] of array[1..6] of real
sunt vectori cu 6 componente reale. Dac T este un tablou de acest tip atunci T are 10 componente,
fiecare component fiind un vector cu 6 componente. De fapt este vorba de o matrice cu 10 linii i 6
coloane. Componenta T[i] a acestui tablou va fi un vector cu 6 componente numere reale. Selectarea
elementului cu indicele j al tabloului T[i] poate fi fcut prin T[i][j].
Menionm c se accept o prescurtare a declaraiei de mai sus sub forma
array[1..10, 1..6] of real
Dei nu este o declaraie echivalent cu cea de mai nainte ea permite totui declararea unei
matrice cu 10 linii i 6 coloane. Diferena const n faptul c folosind aceast declaraie o linie a
matricei nu mai este considerat ca o entitate de sine stttoare. Referirea la linia i prin T[i] este
greit n acest caz, iar prin T[i, j] se refer elementul din linia i coloana j.
________________________________________________________________________________
115
________________________________________________________________________________
116
{patrata de ordinul n}
begin
for i:=1 to n do
for j:=1 to n do
begin
Write('A(', i, ',', j, ')=');
Readln(A[i,j])
end;
end;
________________________________________________________________________________
117
{matricea A de ordinul n}
var i, j: Integer;
begin
writeln; writeln;
writeln(s);
for i:=1 to n do
begin
Writeln;
for j:=1 to n do
Write(A[i,j]:8:1);
end
end; {TipMat}
Procedure ProdMat(n: Byte; A, B: Mat; var C: Mat); {n = ordinul matricelor}
{C := A * B}
var i, j, k: Integer;
s : Real;
begin
for i:=1 to n do
for j:=1 to n do
begin
s:=0;
for k:=1 to n do
s := s+A[i,k]*B[k,j];
C[i,j] := s
end
end; {ProdMat}
begin
Writeln('Se tiparesc puterile unei matrice');
Writeln('Dati matricea !);
CitMat(n, A);
TipMat(n, A, 'Matricea A este: ');
________________________________________________________________________________
118
________________________________________________________________________________
120
{ a e bisect }
if a mod 4 = 0 then
Bisect := True
else
Bisect := False
end;
Procedure CitData(var D: Data);
{ Citete un triplet }
begin
end;
Function NrZiAn(V: Data): Integer; { NRZIAN := a cata zi }
var i, nr: Integer;
{ in an este data V }
begin
________________________________________________________________________________
121
________________________________________________________________________________
122
________________________________________________________________________________
124
________________________________________________________________________________
125
________________________________________________________________________________
126
II.1.1. Definiii
Prin list nelegem un ir (eventual vid) de elemente aparinnd unei mulimi de date (Tomescu
[1997]). Memorarea listelor liniare se poate face n mai multe moduri, n continuare prezentndu-se
unele dintre ele.
Alocarea secvenial (static) const n a memora elementele listei n locaii succesive de
memorie, conform ordinei acestor elemente n list; n acelai timp se memoreaz adresa de baz
(adresa primului element al listei). Un exemplu tipic este cel n care elementele listei sunt memorate
ntr-un vector, adresa de baz fiind adresa primului element al vectorului.
Alocarea nlnuit (dinamic) presupune c fiecare element al listei liniare este nlocuit cu o
celul format din dou pri: o parte conine o informaie specific al elementului i o parte cu
informaia de legtur, care conine adresa celulei corespunztor urmtorului element.
info
successor
nod
adr1, adr2, ..., adrn reprezint adresele din memorie ale celor n nregistrri;
inf1, inf2, ..., infn reprezint informaiile utile din cele n nregistrri
________________________________________________________________________________
127
________________________________________________________________________________
128
________________________________________________________________________________
129
________________________________________________________________________________
130
________________________________________________________________________________
131
________________________________________________________________________________
132
________________________________________________________________________________
133
13.) S se memoreze o matrice rar sub forma unei liste nlnuite, n care elementele matricei vor
fi reinute n ordinea lor natural (pe linii), indiferent de ordinea introducerii lor. S se tipreasc
aceast matrice n forma normal (toate elementele, inclusiv cele nule).
________________________________________________________________________________
134
________________________________________________________________________________
135
Procedura Creare
List = NIL;
End;
b. Algoritmul Inserare
b1. Inserare_nceput: inserm un element la nceputul listei ;
________________________________________________________________________________
136
________________________________________________________________________________
137
________________________________________________________________________________
138
________________________________________________________________________________
140
d.3 tergere_Mijloc : tergerea unui element dup un element dat din list, a crui adres este
numit dup;
;
________________________________________________________________________________
142
________________________________________________________________________________
143
TOP
Fig.2.15. Reprezentare unei stive secveniale.
Operaiile efectuate asupra stiva sunt:
a. testare capacitate superioar (stiv plin);
b. testare capacitate inferioar (stiv goal);
c. inserare de noi elemente, operaie numit PUSH
d. extragere (tergere) din stiv, operaie numit POP.
a.Testare capacitate superioar (stiv plin);
Function Full_Stack(TOP:INTEGER): boolean
Begin
If TOP = n then
Full_Stack:=TRUE
else
Full_Stack:=FALSE;
End;
________________________________________________________________________________
144
________________________________________________________________________________
145
TOP
________________________________________________________________________________
147
extragere
inserare
Front
Rear
Fig.2.17. Reprezentare unei cozi secveniale.
________________________________________________________________________________
148
________________________________________________________________________________
149
Front
Rear
________________________________________________________________________________
150
II.5.1. Definiii
Un arbore este o mulime de elemente numite noduri, un singur nod avnd rolul de nod
rdcin, mpreun cu o relaie de tip printe-fiu care definete o structur ierarhic pe mulimea
nodurilor. n mod formal, un arbore poate fi definit recursiv astfel (Aho et al. [1987]):
1. Un arbore poate conine un singur nod. Acest nod este i nodul rdcin al arborelui.
2. Fie n un nod i T1, T2, , Tk arbori cu nodurile rdcin n1, n2, , nk. Putem construi un nou
arbore, fcnd ca nodul n s devin nodul printe al nodurilor n 1, n2, , nk. n acest arbore, n
este nodul rdcin, iar T1, T2, , Tk se numesc subarbori. Nodurile n1, n2, , nk se numesc
noduri fiu ale nodului n.
Un arbore binar este o structur arborescent n care fiecare vrf are cel mult doi
descendeni, fcndu-se ns distincie clar ntre descendentul drept i descendentul stng al
fiecrui vrf. Se accept i arborele binar cu 0 vrfuri, numit arbore binar vid.
Arborii binari nu reprezint cazuri particulare de arbori orientai, dect dac se face
abstracie de distincia menionat ntre descendentul drept i cel stng al fiecrui vrf. ntr-adevr
dac un vrf are un singur descendent, aceast informaie este suficient n cazul unui arbore, dar
insuficient n cazul unui arbore binar, cnd trebuie precizat dac acest descendent este descendent
stng sau descendent drept.
ntr-o structur de tip arbore, elementele sunt structurate pe nivele; pe primul nivel, numit
nivel 0, exist un singur nod numit rdcin, de care sunt legate mai multe noduri, numite fii care
formeaz nivelul 1; de acestea sunt legate elementele de pe nivelul 2 .a.m.d.
________________________________________________________________________________
152
________________________________________________________________________________
153
________________________________________________________________________________
155
II.5. Grafuri
II.5.1. Grafuri orientate
II.5.1.1. Definiii i generaliti
Definiia 1.5. Un graf orientat este un cuplu G (X, U), unde X este o mulime finit i nevid de
elemente numite vrfuri, i U XX este o mulime de elemente numite arce.
Fie un arc u = (x,y) U. Spunem c arcul u este incident exterior cu vrful x, este incident
________________________________________________________________________________
156
x X1 i y X2.
Un graf G (A, V) este subgraf al grafului G = (X, U) dac A X i V (AA) U.
Un graf G (X, V) este graf parial al grafului G (X, U) dac V U.
Un graf G (A, V) este subgraf parial al grafului G (X, U) dac A X i V (AA) U.
Definiia 1.8 Fiind dat un graf orientat G (X, U), un drum n graful G este o succesiune de arce cu
proprietatea c extremitatea terminal a unui arc coincide cu extremitatea iniial a arcului urmtor
________________________________________________________________________________
157
A i, j
(5.x)
________________________________________________________________________________
158
1
0
0
0
1
0
0
1
1
0
Fig. 5.x:Reprezentarea grafului orientat din Figura 5.x cu ajutorul listelor de adiacen.
Reprezentrii grafurilor orientate cu ajutorul listelor de adiacen necesit un spaiu de
________________________________________________________________________________
159
Definiia 1.9. Un graf neorientat este un cuplu G = (X, U), unde X este o mulime de elemente
numite vrfuri, i U este o mulime de perechi neordonate de vrfuri numite muchii. O muchie (x, y)
nu are orientare, astfel c (x, y) (y, x).
O muchie este incident vrfurilor care sunt extremiti ale sale. Dou vrfuri sunt adiacente
dac ntre ele exist o muchie. Dou muchii sunt adiacente dac au o extremitate comun. Gradul
unui vrf x este numrul de muchii incidente cu acesta i se noteaz g(x).
Definiia 1.10. Un lan este o succesiune de muchii cu proprietatea c orice muchie are un vrf
comun cu muchia precedent i cellalt vrf comun cu muchia succesoare.
n mod analog definim noiunea de ciclu corespunztoare noiunii de circuit de la grafuri
orientate.
Definiia 1.11. Un graf neorientat este conex dac ntre orice dou vrfuri exist un lan.
O component conex a unui graf neorientat este un subgraf conex maximal n raport cu operaia
de incluziune. Cu alte cuvinte, nu exist o submulime de vrfuri mai numeroas care s induc un
subgraf conex.
Definiia 1.12. Un arbore este un graf conex fr cicluri.
Lema 1.1. Un arbore cu n vrfuri are n1 muchii.
Demonstraie (Livovschi i Georgescu [1986]). Considerm pentru nceput un graf cu dou
vrfuri unite printr-o muchie, care este evident un arbore. La fiecare pas adugm un vrf nou pe
care l unim printr-o muchie cu un vrf deja existent. Presupunem c dup un numr de pai avem un
________________________________________________________________________________
160
A i, j
(5.x)
Obs. 5.x: Se observ c matricea de adiacen ataat grafului este simetric n raport cu diagonala
principal.
0
1
0
1
1
1
0
1
1
1
________________________________________________________________________________
161
Fig. 5.x:Reprezentarea grafului orientat din Figura 5.x cu ajutorul listelor de adiacen.
Definiia 1.13. Un graf G este planar dac este posibil s fie reprezentat pe un plan astfel nct
vrfurile s fie distincte, muchiile curbe simple i dou muchii s nu se intersecteze dect la
extremitile lor (dac sunt adiacente).
Reprezentarea grafului conform cu condiiile impuse se numete graf planar topologic i se
noteaz tot prin G. Nu se consider distincte dou grafuri planare topologice dac le putem face s
coincid prin deformarea elastic a planului.
________________________________________________________________________________
162
mf 2.
Corolar 1.3. n orice graf planar topologic conex cu n vrfuri, m muchii i f fee avem:
(i) n 2m/3 ; m 3f6 ; n 2f4
(ii) f 2m/3 ; m 3n6 ; f 2n4 (dac graful are cel puin dou muchii)
Demonstraie. (i) Din fiecare vrf pleac cel puin trei muchii, i fiecare muchie unete dou
vrfuri; rezult 3n 2m. Celelalte dou inegaliti rezult prin simpl nlocuire.
________________________________________________________________________________
163
________________________________________________________________________________
164