Documente Academic
Documente Profesional
Documente Cultură
Elev:
Profesor coordonator:
Roman
Mai 2011
Tem proiect :
Programare orientat pe obiect.
Grafuri neorientate.
Cuprins
Cuprins........................................................................................................................................ 3
Argument......................................................................................................................................4
5
1. Programare orientat pe obiect (noiuni introductive)..........................................
Noiuni introductive............................................................................................9
2.2
12
Modaliti de reprezentare.....................................................................................
14
3. Algoritmi eseniali grafuri neorientate...............................................................
3.1
Citirea grafurilor..14
3.2
14
Afiarea grafurilor..
3.3
14
Parcurgerea grafurilor..
3.4
16
Lan. Lan elementar. Ciclu. Ciclu elementar..
3.5
16
Graf complementar..
3.6
17
Graf bipartit..
3.7
17
Graf conex. Numarul de componente conexe
3.8
Graf hamiltonian..................................................................................................18
3.9
18
Graf eulerian
19
3.10 Algoritmul Bellman-Ford.
22
3.11 Algoritmul lui Kruskal..
24
3.12 Algoritmul lui Prim
27
3.13 Grafuri izomorfe....................................................................................................
3.14 Supraincarcarea operatorilor.............................................................................. 27
4. Clasa graf.........................................................................................................28
4.1
graf.h................................................................................................................ 29
4.2
graf.cpp............................................................................................................ 30
50
5. Bibliografie...........................................................................................................
Argument
nc de la apariia limbajelor de programare s-a ncercat ca acestea s descrie cat mai bine
realitatea. Programarea Orientata pe Obiecte (POO) este o modalitate avansat de programare care
se apropie foarte mult de acest scop. Cuvantul cheie e obiectul (clasa).
Am ales graful ca tem pentru realizarea proiectului deoarece consider c grafurile au o
importan deosebit fiind utilizai n domenii precum: cibernetic, matematic, cercetri
operaionale n vederea optimizrii diferitelor activiti economice, chimie (pentru descrierea
structurii cristalelor), reelele de transport de toate tipurile (pentru optimizarea traseelor), circuite
electrice (pentru simularea funcionri corecte), inteligena artificiala i nu n ultimul rnd n
domeniul analizei aplicaiilor software.
1.
obiectelor, adic, pe proprietile acestora, numite date, i pe funciile acestor obiecte, numite
metode.
Clase i obiecte
La baza POO stau conceptele de clas i de obiect.
Definitia 1
Clasa, ntr-un anumit limbaj de programare, reprezin definirea unui tip de obiecte
abstracte sau concrete, adic descrierea proprietilor, a datelor i a metodelor, a prelucrrilor,
5
Definitia 2
Obiect, reprezin o multime de date care descrie un anumit obiect concret sau
abstract, numite i proprieti, impreuna cu procedurile, funciile, de prelucrare a cestora, numite
metode.
Crearea unui obiect presupune specificarea clasei din care face parte, astfel
idendtificndu-se proprietile obiectului i modul n care acestea pot fi folosite i prelucrate
Observaie:
Crearea sau declararea unui obiect este similar cu crearea sau declararea unor variabile.
Declararea unei variabile se face, dup cum se stie, prin specificarea identificatorului acesteia,
precedat de tipul variabilei iar declararea unui obiect presupune precizarea identificatorului
acestuia, precedat de clasa din care face parte, clasa care n mod implicit determin proprietile i
metodele obiectului definit.
O clas n limbajul C++ poate fi reprezentata ca o extindere a conceptului de structura,
care, ca i o structura, descrie un ablon pentru viitoarele declarari de variabile obiect.
..
specificator_accesn;
date_i_funciin;
}[obiect1] [,obiect2] [,obiectm];
In fiierul nume_clasa.cpp:
Codul complet al metodelor
unde:
- nume_clasa este un identificator ales de programator care denumete clasa
definita i prin intermediul caruia se apeleaza aceasta;
- specificator_accesi (i=1,n) este o eticheta care poate fi unul dintre cuvinele cheie:
public, private sau protected.
Spre deosebire de o structura, ai carei membri sunt toti accesibili programului, o clasa
poate avea membri pe care programul ii poate accesa direct (public), utilizand operatorul punct (.)
i alti membri, denumiti privati (private), pe care programul nu-i poate accesa direct. Unica
accesare a datelor i metodelor private (private) se face numai prin intermediul metodelor publice.
Dup cum se va vedea, o clasa poate deriva dintr-o clasa de baza, anterior definita, concept
cunoscut sub numele de mostenire. Un membru protejat (protected) are un statut intermediar intre
membri publici i privati. Pentru clasa de baza, obiectele acesteia pot accesa membri protejati, ca i
cum ar fi publici, iar obiectele claselor derivate nu pot accesa un membru declarat protected n
clasa de baza, decat prin intermediul unor funcii de interfata declarate publice.
- date_i_funciii; (i=1,n) descrie datele, adic proprietile, i funciile, adic metodele
specifice clasei definite care, n funcie de specificator_accesi (i=1,n), pot fi public, private sau
protected.
- [obiect1] [,obiect2] [,obiectm] reprezin identificatorii obiectelor de tipul clasei la
care sunt atasati, adic numele variabilelor obiect respective care vor fi utilizate n programul n
care apar.
2.
Grafuri neorientate
1
2
G=(X,U)
X={1, 2, 3, 4, 5}
Figura 1.
1
2
Figura 2.
5
V={[5,1], [5,4]}
Definiie Un subgraf al unui graf neorientat G=(X,U) este un graf H=(Y,V) astfel nct YX i V
conine toate muchiile din U care au ambele extremiti n Y (poate fi graful iniial sau se obine din
acesta prin eliminarea unor vrfuri i a muchiilor incidente cu acestea). Spunem c subgraful H este
indus de mulimea de vrfuri Y.
Figura 3.
d(5)=3
Figura 4.
Definiie Un graf se zice regulat, dac toate vrfurile sale au acelai grad.
Exemplu: graful din figura 5
Figura 5.
d(1)=d(2)=d(3)=1
1
Prop. Dac un graf G=(X,U) are n vrfuri i m muchii, iar X={x1, x2, , xn} atunci
d(xi)=2m, i=1,n. (suma gradelor vrfurilor unui graf este 2m)
Definiie Ordinul unui graf este numrul nodurilor sale.
Definiie Se numete graf complet cu n vrfuri un graf care are proprietatea c oricare dou noduri
diferite sunt adiacente.
Obs. 1. Un graf complet are n(n-1)/2 muchii.
2. d(i)=n-1
i={1,2,3,4}
Figura 6.
3
4
.
Definiie
Fie un graf G=(X,U) cu vrfurile X={x 1, x2,, xn}. Se numete lan n graful G
succesiunea de vrfuri
L=[ x1, x2,, xk] cu proprietatea c dou vrfuri consecutive din L sunt adiacente, adic
muchiile
[ x1, x2], [x2,x3] [xik-1,xik] sunt din U.
Definiie Vrfurile x1 i xk se numesc extremitile lanului.
Definiie Numrul de muchii al unui lan reprezint lungimea lanului.
10
(de lungime 5)
Definiie Un lan este elementar dac toate vrfurile sale sunt distincte. Altfel este neelementar.
Definiie Un lan este simplu dac are toate muchiile distincte. n caz contrar se zice compus.
Obs. Un lan compus este neelementar.
Exemplu: pentru graful din Figura 11:
L1, L2 sunt lanuri neelementare
L3 este lan elementar, simplu;
Definiie Se numete ciclu n G un lan L pentru care x 1=xk i toate muchiile [x1, x2], [x2,x3] [xk,xk] sunt diferite dou cte dou.
Definiie Se numete ciclu elementar un ciclu care are proprietatea c oricare dou vrfuri ale sale
su excepia primului i ultimului sunt diferite dou cte dou. Altfel se zice neelementar.
Exemplu: pentru graful din Figura 11:
C1=[1,2,4,5,6,3,1] este un ciclu elementar
C2=[3,7,5,6,3,1,2,4,5,6,3] este un ciclu neelementar
Definiie Lungimea unui ciclu este dat de numrul su de muchii.
Obs. Un ciclu are lungimea minim de trei muchii.
Definiie Fiecrei muchii a unui graf neorientat i se poate asocia o valoare real pozitiv care
reprezint costul acelei muchii.
Definiie Un graf neorientat n care fiecrei muchii i s-a asociat o valoare se numete graf ponderat
sau graf valoric.
Definiie Fie un graf neorientat G=(X, U) i o funcie L: UR+, care asociaz fiecrei muchii
uU un numr real numit costul (ponderea) sa L(u). Costul unui graf reprezint suma costurilor
muchiilor sale.
1
2
Figura 8.
6
5
3
1
11
8
4
3
4
Figura 9
.
2. Specificarea mulimilor:
G=(V,U)
V={1,2,3,4,5,6}
U={[1,2], [2,3], [2,5], [5,6]}
3. Matricea de adiacen (si a costurilor)
Matricea de adiacen asociat acestui graf este o matrice ptratic A de dimensiune N cu
proprietatea c:
1, dac exist muchia [i, j] cu ij
a[i , j] =
0, altfel
Pentru graful de la fig 9:
1
2
3
4
5
6
1
0
1
0
0
0
0
2
1
0
1
0
0
0
3
0
1
0
0
0
0
4
0
0
0
0
1
0
5
0
0
0
1
0
1
6
0
0
0
0
1
0
12
1
1
1
0
0
0
0
2
0
1
1
0
0
0
3
0
0
0
1
1
0
4
0
0
0
0
1
1
5. Listele de adiacen
nod: lista nodurilor adiacen
Pentru graful din figura 9:
1: 2
2: 1, 3
3: 2
4: 5
5: 4, 6
6: 5
6. Vector de muchii (si cost)
Implementarea grafului ca vector de muchii presupune definirea unei structuri Muchie cu
dou cmpuri reprezentnd extremitile unei muchii. Graful este implementat printr-un vector G
ale crui elemente sunt de tip Muchie. Elementul de pe poziia i din vector va contine dou
informatii (G[i].v1, G[i].v2)corespunztoare extremitilor muchiei i: v1 i v2.
Pentru grafurl din figura 9:
G.v1:
G.v2:
2
3
5
6
Obs: n cazul grafurilor ponderate, structurii muchie I se mai adauga inca un camp cost
reprezentand costul muchiei (G[i].cost = costul muchiei [G[i].v1, G[i].v2])
13
3.2Afisarea grafurilor
La fel ca i citirea, afisarea grafurilor variaza n funcie de modul de reprezentare pe care il
dorim.
3.3Parcurgerea grafurilor
Parcurgerea unui graf presupune examinarea sistematic a vrfurilor grafului, cu scopul
prelucrrii informaiilor asociate vrfurilor.
Exist dou metode fundamentale de parcurgere a grafurilor:
1. Parcurgerea n adncime (DFS Depth First Search)
2. Parcurgerea n lime (BFS Breadth First Search)
a.
Parcurgerea n adncime
Parcurgerea n adncime se caracterizeaz prin faptul c se merge n adncime ori de
Parcurgerea n adancime
Parcurgerea n latime
Figura 10
lan
15
lan elementar
ciclu
ciclu elementar
Figura 11
16
Figura 12
5
3
17
Figura13
.
C1=[1,2,5,4,3,6,1]
Figura 14
3
1
4
1
C2=[1,2,3,4,5,6,1]
6
1
5
1
1
7
18
Figura 15
Figura 16
0
1
2
3
4
5
6
Pasul urmtor const n iniializarea restului valorilor din viz cu valori foarte mari.
viz:
1
2
3
4
5
Se construiete o coad cu numele c.
1
2
3
4
5
6
Urmtorul nod adiacent al lui 1 care este 3; astfel se marchez n viz pe poziia 3 cu 4 i se
adaug n coad nodul 3.
c:1,5,3
viz:
1
2
3
4
5
6
Se ia n continuare urmtorul nod adiacent al lui 1, care este 2 i se marcheaz n viz pe
poziia 2 cu 5, iar n coad se aduag 2.
c:1,5,3,2
viz:
0
5
4
1
2
3
4
5
6
Urmtorul nod adiacent al lui 1 este 6 i astfel se marcheaz n viz pe poziia 6 cu 6, iar n
coad se adaug nodul 6.
c:1,5,3,2,6
viz:
0
5
4
1
6
1
2
3
4
5
6
Pentru c nodul 1 nu mai are adiaceni se trece la nodul urmtor, 5 i se marcheaz n coad
cu rou pentru a evidenia.
c:1,5,3,2,6
Se ia primul adiacent al lui 5,1.
20
0
5
4
3
1
6
1
2
3
4
5
6
Urmtorul nod adiacent al lui 5. ns nu sunt modificri n viz deoarece costul lui 5 pn la 1
este 1 i de la 5 la 6 este 9 i astfel, prin nsumare costul de la 5 la 6 devine 10 i este mai
mare decat era iniial.
Nodul urmtor din coad, 3.Se evideniaz cu rou n coad.
c:5,3,2,6,4
Primul adiacent al lui 3.Acesta fiind 1, nu exist modificri.
Urmtorul adiacent al lui 3 este 2. ns nici de data aceasta nu sunt modificri deoarece prin
nsumare(4+7=11) noul cost ar fi mai mare decat cel iniial,5.
Urmtor adiacent al lui 3 este 4. Noul cost ar deveni 7 prin nsumare(4+3=7) i astfel nu
sunt modificri.
Pentru c nu mai sunt adiaceni ai lui 3 se trece la nodul urmtor,2 i se n eviden cu rou
n coad.
c:1,5,3,2,6,4
Urmtorul adiacent al lui 2 este 3. Prin nsumare noul cost al lui 3 ar deveni 12 i astfel nu
sunt modificri.
Urmtorul adiacent al lui 2 fiind 4 se afl ct ar deveni noul cost al lui 4. Prin nsumare ar
deveni i deci nu sunt modificri.
Urmtorul adiacent al lui 2 6, cu noul cost 9, care este mai mare dect 6 i deci nici de data
aceasta nu sunt modificri.
Se trece la urmtorul nod din coad pentru c nu mai sunt adiaceni ai lui 2.
c:1,5,3,2,6,4
21
elimin o muchie de cost minim din U cu extremitatile nemarcate sau marcate diferit
dac acea muchie unifica doi arbori distinci, atunci adaug muchia, unificand cei doi
arbori ntr-unul singur
la sfarsit, vom avea o singura componenta conexa, care este arborele partial de cost minim al
grafului.
Algoritmul lui Kruskal. Exemplu
22
Figura 17
Iniial:
viz:
Costul=0
Se alege muchia [2,4]
viz:
Costul=0+1costul=1;
Se alege muchia [5,6]
viz:
Costul=1+1costul=2
Se alege muchia [7,8]
viz:
Costul=2+1costul=3
Se alege muchia [2,6]
viz:
23
5
1
Figura 18
8
6
s:
1
1
2
Pasul 1:
viz:
t:
24
,i x
2
1
viz:
1
t:
1
0
2
1
2
0
2
2
3
2
4
2
5
2
6
Pasul 2:
2
1
0
2
5
2
2
3
4
5
viz:
1
1
1
2
3
4
5
t:
0
2
1
2
3
4
5
Dup a dou executie a pasului 2:
s:
2
1
0
6
5
2
3
4
viz:
1
1
2
3
4
t:
0
1
2
3
4
Dup a treia executie a pasului 2:
s:
2
1
viz:
1
t:
1
0
2
1
2
0
2
6
3
1
3
6
3
5
4
4
4
5
6
6
6
2
5
1
5
2
5
5
6
1
6
5
6
2
5
1
5
2
5
5
6
1
6
5
6
25
2
1
0
6
5
2
2
3
4
5
viz:
1
1
1
1
1
2
3
4
5
t:
0
6
5
2
1
2
3
4
5
Dup a cincea executie a pasului 2:
s:
2
1
1
1
2
1
viz:
t:
3.13
0
2
1
2
0
2
6
3
1
3
6
3
5
4
1
4
5
4
2
5
1
5
2
5
5
6
1
6
5
6
5
6
1
6
5
6
Grafuri izomorfe
26
Figura 19
3.14
Supraincarcarea operatorilor
Funciile operator constituie un tip special de funcii, care se pot utiliza pentru redefinirea
operatorilor de baza care apar n C++. O clasa se poate defini mpreuna cu un set de operatori
asociati, obtinuti prin suprancarcarea operatorilor existenti. n acest fel, se efectueaza operatii
specifice noului tip, la fel de simplu ca n cazul tipurilor standard.
Supradefinirea se realizeaza astfel:
tip_val_intoarsa operator op (lista_declar_parametri)
{
// . . . . corpul funciei
}
Supraincarcarea operatorului ,,+:
1. Graf +nr ( numar) adauga graficului nr noduri izolate
2. Graf + muchie adauga graficului muchia adunata, daca aceasta nu exist
Supraincarcarea operatorului ,,-:
1. Graf - nr scade graficului nodul nr, daca acesta exist. Totodata nodurile mai mari ca nr scad
cu o unitate pentru ca nodurile graficului sa fie consecutive
2. Graf - muchie scade graficului muchia adunata, daca aceasta exist
4. Clasa graf
Legenda:
n-numarul de noduri/vrfuri ale unui graf
27
Observaii:
1.
2.
vectorul de muchii - costuri. La fel vom proceda i daca vom citi un graf printr-un alt mijloc.
3.
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
viz: ";//vizul in acest caz are salvate pe pozitia i, costul minim de a ajunge de la x la
nodul i
for(i=1;i<=n;i++)
cout<<viz[i]<<" ";
cout<<"\n\n p: ";
for(i=1;i<=n;i++)
cout<<p[i]<<" ";
}
int graf::graf_partial(graf G1)
{
int i, j;
if(n!=G1.get_n())
return 0;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(ma[i][j]==0&&G1.get_i_j_ma(i,j)==1)
return 0;
return 1;
}
int a[10],b[10], suma=0;
int verificare(graf G2, int f[], graf G1)
{
int i, j;
if(G1.get_n()!=G2.get_n()||G2.get_n()!=G1.get_n())
return 0;
for(i=1;i<=G2.get_n()-1;i++)
for(j=i+1;j<=G2.get_n();j++)
if(G1.get_i_j_ma(i,j)!=G2.get_i_j_ma(f[i],f[j]))
return 0;
return 1;
}
void back(int k, graf G2, graf G1)
{
if(k-1==G2.get_n())
suma=suma+verificare(G2,a,G1);
else
{
for(int i=1;i<=G2.get_n();i++)
if(!b[i])
45
46
47
48
5. Bibliografie
http://facultate.regielive.ro
http://www.graf.go.ro/index1.html
http://ro.wikipedia.org/wiki/Graf
http://ro.wikipedia.org/wiki/Programare_orientat%C4%83_pe_obiecte
49
http://www.aut.upt.ro/~dberian/Labs/POO.pdf
http://ro.wikipedia.org/wiki/Algoritmul_lui_Kruskal
http://ro.wikipedia.org/wiki/Algoritmul_lui_Prim
http://grafurineorientate.wikispaces.com/
50