Sunteți pe pagina 1din 27

Elev: Tarbuc Eugen-Cosmin CNAIC, 12 B Profesor coordonator: Magdalena Grigore

CUPRINS
1

Argument.3 GRAFURI NEORIENTATE 1. Definitie..4 2. Gradul unui nod..4 3. Graf Partial..5 4. Subgraf5 5. Lant.6 6. Ciclu6 7. Graf nul...6 8. Graf complet....7 9. Graf convex..7 10.Parcurgerea in adancime.....8 11.Parcurgerea in latime..8 12.Teoreme...9 PROBLEME
MATRICE ADIACENTA..11 GRAF PARTIAL.13

GRADELE NODURILOR.....15 NODURILE IZOLATE..16 CICLUE ELEMENTAR ....18 GRAF COMPLET..20 GRAF CONVEX22 PARCURGEREA IN LATIME23 PARCURGEREA IN ADANCIME...25
2

BIBLIOGRAFIE.26

Argument nc de la apariia limbajelor de programare s-a ncercat ca acestea s descrie cat mai bine realitatea. 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.

GRAFURI NEORINTATE

U
Exemple

n graf neorientat este o pereche ordonat de multimi (V, M), unde: V={v1, v2, v3, , vn} este o multime finit i nevid de elemente, numite noduri sau vrfuri, iar M este o multime finit de perechi neordonate, distincte, de elemente din V, de forma (vi, vj) unde ij i vi, vjV.

Figura 1b Gradul unui nod X reprezint numrul de muchii incidente cu nodul X i l notm cu d(x). Un nod X al unui graf neorientat G=(V,M) se numete nod izolat dac are gradul zero. Un nod X al unui graf neorientat G=(V,M) se numete nod terminal dac are gradul unu.

Nod terminal este nodul 3 din graful neorientat iar d(3)=1. Pentru graful din Figura 1.b. gradele nodurilor sunt: d(1)=2, d(2)=2, d(3)=1, d(4)=2, d(5)=3

Un graf neorientat Gp=(V,Mp) este graf partial al unui graf G=(V,M) dac MpM. Graful partial Gp=(V,Mp) se obtine prin eliminarea uneia sau mai multor muchii din graful G=(V,M). Considerm graful G=(V,M) din figura a. Dac din acest graf eliminm muchiile (1,4) i (3,4), obtinem graful partial Gp=(V,Mp) din figura b
5

Fig a SUBGRAF

Fig b

Un graf neorientat Gs=(Vs,Ms) este subgraf al unui graf G=(V,M) dac MsM i VsV. Subgraful Gs=(Vs,Ms) se obine prin eliminarea uneia sau mai multor noduri din graful G=(V,M) i a tuturor muchiilor incidente cu acestea. Considerm graful G=(V,M) din figura 3 a. Dac din acest graf eliminm vrful 3 i toate muchiile incidente cu acest vrf, obtinem subgraful Gs=(Vs,Ms) al grafului G=(V,M), din figura b.

Fig a

Fig b

LANT Se numete lant, o secvent de noduri ale unui graf neorientat G=(V,M), cu proprietatea c oricare dou noduri consecutive sunt adiacente. Lungimea unui lant este dat de numrul de muchii din care este format.
6

Se numete lant elementar un lant care contine numai noduri distincte. Se numete lant simplu un lant care contine numai muchii distincte. Se numete lant compus un lant care nu este format numai din muchii distincte. CICLU Se numete ciclu, un lant n care primul nod coincide cu ultimul i muchiile sunt distincte dou cte dou. Se numete ciclu elementar un ciclu care este format doar din noduri distincte, exceptie fcnd primul i ultimul nod. GRAF NUL Graful G=(V,M) se numete graf nul dac multimea M este vid, adic graful nu are muchii. Pentru graful nul din figura de mai jos avem: V={1,2,3} M=

GRAF COMPLET Prin graf complet se ntelege un graf neorientat n care oricare dou noduri sunt adiacente. Pentru graful complet din figura avem: V={1,2,3,4} M={(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)} GRAF CONVEX

Graful G=(V,M) se numete graf conex dac pentru oricare dou noduri vi, vj V, exist un lant de la vi la vj. Pentru graful conex din figura avem:

V={1,2,3,4,5} M={(1,3),(1,5),(2,3),(2,4),(2,5)} Se numete component conex a grafului G=(V,M), un subgraf conex al lui G, C=(V1,M1) cu proprietatea c nu exist nici un lant n G care s lege un nod din V1 cu un nod din V-V1. PARCURGEREA IN ADANCIME Parcurgerea n adncime se realizeaz prin vizitarea nodurilor grafului G=(V,M), n urmtoarea ordine: - se viziteaz nodul i - se viziteaz primul nod adiacent cu el, nc nevizitat, dup care urmtorul nod adiacent cu el i tot aa pn cnd nu mai are noduri adiacente cu el nevizitate - se revine la nodul I i se reiau paii - se ncheie parcurgerea dup ce se parcurg toate nodurile grafului De exemplu, pentru graful din figura, parcurgerea n adncime este: - din nodul 1 -> 2, 3, 5, 4 - din nodul 2 -> 1, 3, 4, 5 - din nodul 3 -> 1, 2, 5, 4 OBS

Parcurgerea n adncime depinde de ordinea de selectie a nodurilor adiacente. PARCURGEREA IN LATIME Parcurgerea n ltime se realizeaz prin vizitarea nodurilor grafului G=(V,M), n urmtoarea ordine: - se viziteaz nodul i - se viziteaz toate nodurile adiacente cu nodul i,respectiv i1, i2, i3, ik - se viziteaz toate nodurile adiacente cu nodul i1, dup care toate nodurile adiacente cu i2pn la ik - se ncheie parcurgerea dup ce se parcurg toate nodurile grafului De exemplu, pentru graful din figura 12.a, parcurgerea n ltime este: - din nodul 1 -> 2, 3, 4, 5 - din nodul 2 -> 1, 3, 5, 4 - din nodul 3 -> 1, 2, 4, 5 Parcurgerea n ltime depinde de ordinea de parcurgere a nodurilor adiacente. TEOREME 1. Suma gradelor nodurilor unui graf G=(V,M) cu n noduri i m muchii este 2*m. 2. Pentru orice graf neorientat numrul nodurilor de grad impar este par. 3. Dac graful neorientat G=(V,M) are n noduri, n>2, atunci cel putin 2 noduri au acelai grad.
9

4. Numrul total de grafuri neorientate cu n noduri este 2 la puterea n(n-1)/2. 5. Numrul de grafuri partiale ale unui graf cu m muchii este 2 la puterea m . 6. Numrul de subgrafuri ale unui graf nu n noduri este puterea n)-1 (2 la

PROBLEME
10

MATRICE ADIACENTA S se afieze matricea de adiacent a unui graf neorientat cu n noduri i m muchii. Se citesc de la tastatur numrul de noduri n i numrul de muchii, dup care se initializeaz matricea mat[i][j] cu 0 (zero). Se apeleaz functia citire(), care va citi de la tastatur muchiile grafului, dup care se apeleaz functia afisare() care va afia matricea de adiacent. #include<iostream.h> int mat[10][10],n,m; void citire() {int a,b,i,m; for(i=1;i<=m;i++) {cout<<"Dati muchia"<<i<<"="; cin>>a>>b; mat[a][b]=mat[b][a]=1; } } void afisare() {int i,j; cout<<"Matricea de adiacenta"; cout<<endl; for(i=1;i<=n;i++) {for(j=1;j<=n;j++) cout<<mat[i][j]<<" ";
11

cout<<endl; } } void main() {int i,j; cout<<"n=";cin>>n; cout<<"m=";cin>>m; for(i=0;i<n;i++) for(j=0;j<n;j++) mat[i][j]=0; citire(); afisare(); }

GRAF PARTIAL S se verifice dac un graf P este graf partial al grafului G. Cele dou grafuri au n noduri i sunt date prin matricile lor de adiacent. Mai jos este o solutie posibil a problemei. Se citesc cele dou matrici de adiacent cu ajutorul functiei citire. Functia verif() va verifica dac matricea de adiacent a grafului P are multimea muchiilor inclus n multimea muchiilor grafului G. #include<iostream.h> int n,a[10][10],b[10][10]; void citire(char c,int mat[10][10]) {int i,j; for(i=1;i<n;i++)
12

for(j=i+1;j<=n;j++) {cout<<c<<"["<<i<<"]["<<j<<"]="; cin>>mat[i][j];} } int verif() {int i,j; for(i=1;i<n;i++) for(j=i+i;j<=n;j++) if(a[i][j]<b[i][j]) return 0; return 1; } void main() {cout<<"dati n="; cin>>n; cout<<"Dati elementele grafului G, dat prin matricea de adiacenta G"<<endl; citire('G',a); cout<<"Dati elementele grafului P, dat prin matricea de adiacenta P"<<endl; citire('P',b); if(verif()) cout<<"Graful P este graf partial al grafului G"; }
13

Gradele nodurilor S se verifice dac valorile d1, d2, , dn pot reprezenta gradele nodurilor unui graf neorientat cu n noduri.Mai jos este o solutie posibil a problemei. Se citesc gradele nodurilor grafului i se introduc ntr-un vector, dup care se calculeaz suma gradelor nodurilor (s) i numrul nodurilor izolate (izolat). Functia verif() va returna zero dac: - suma s este impar (tim c s=2*m) - mai mare dect n*(n-1) (tim c s=n*(n-1) la un graf complet) - gradul oricrui vrf este mai mare sau egal dect numrul de noduri minus numrul de noduri izolate Dac functia verif() returneaz zero, valorile date nu pot reprezenta gradele unui graf neorientat, altfel, pot reprezenta gradele unui graf neorientat. #include<iostream.h> int n, d[10], s=0, izolat=0; void citire() { int i; for(i=1;i<=n;i++) { cout<<"d["<<i<<"]=";cin>>d[i]; s=s+d[i]; if(d[i]==0) izolat=izolat+1; }
14

} int verif() { if(s%2!=0||s>n*(n-1)) return 0; else { for(int i=1;i<=n;i++) if(d[i]>=n-izolat) return 0; return 1; } } void main() { cout<<"n=";cin>>n; citire(); if(verif()==1) cout<<"valorile date pot reprezenta gradele unui graf"; else cout<<"valorile date NU pot reprezenta gradele unui graf"; }

15

Noduri izolate S se afieze numrul de noduri izolate ale unui graf G, dat prin matricea de adiacent.Mai jos este o solutie posibil a problemei. Se citete matricea de adiacent cu ajutorul functiei citire(). Functia verif() va verifica dac suma elementelor matricei pe fiecare linie este diferit de zero i va calcula cte sume sunt egale cu zero n variabila global izolat care va retine numrul de noduri izolate. #include<iostream.h> int n,mat[10][10], izolat=0; void citire() {int i,j; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) {cout<<"mat["<<i<<"]["<<j<<"]="; cin>>mat[i][j]; mat[j][i]=mat[i][j];} } int verif() {int i,j,s; for(i=1;i<=n;i++)
16

{ s=0; for(j=1;j<=n;j++) s=s+mat[i][j]; if(s==0) izolat++; } if(izolat==0) return 0; else return 1; } void main() {cout<<"dati n="; cin>>n; cout<<"Dati elementele grafului G, dat prin matricea de adiacenta G"<<endl; citire(); if(verif()==1) cout<<"Graful G contine "<<izolat<<" noduri izolate"; else cout<<"Graful G NU contine noduri izolate"; }

17

Ciclu elementar S se afieze dac o secvent dat de noduri poate reprezenta un ciclu elementar, tiind c graful este dat prin matricea de adiacent.Mai jos este o solutie posibil a problemei. Se citete matricea de adiacent cu ajutorul functiei citire_matrice() i secventa de noduri ntr-un vector v[i], cu ajutorul functiei citire_sir(). Functia ciclu() verific: dac primul element din ir corespunde cu ultimul element, pentru a fi ciclu dac exist muchie ntre oricare dou elemente consecutive ale irului dac muchiile sunt distincte Functia ciclu_elementar() verific dac elementele irului sunt distincte cu exceptia primului i a ultimului element. Din functia main() se verific prima dat irul de elemente cu functia ciclu(), pentru a testa dac irul formeaz un ciclu, dup care se verific cu ajutorul functiei ciclu_elementar(), pentru a testa dac irul dat este ciclu elementar. #include<iostream.h> int mat[10][10], v[10], n, nr; void citire_matrice() {int i,j; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) {cout<<"mat["<<i<<"]["<<j<<"]="; cin>>mat[i][j];
18

mat[j][i]=mat[i][j];} } void citire_sir() { int i; for(i=1;i<=nr;i++) {cout<<"v["<<i<<"]="; cin>>v[i];} } int ciclu(int x) {int i,j; if(v[x]!=v[1]) return 0; for(i=1;i<x;i++) if(mat[v[i]][v[i+1]]==0) return 0; for(i=1;i<x-1;i++) for(j=i+1;j<x;j++) if(v[i]==v[j]&&v[i+1]==v[j+1]||v[i]==v[j+1]&&v[i+1]==v[j]) return 0; return 1; } int ciclu_elementar(int x) {int i,j; for(i=1;i<x;i++)
19

for(j=i+1;j<=x;j++) if(v[i]==v[j]) return 0; return 1; } void main() {cout<<"dati n="; cin>>n; cout<<"Dati elementele grafului G, dat prin matricea de adiacenta G"<<endl; citire_matrice(); cout<<"Dati numarul de elemente=";cin>>nr; citire_sir(); if(ciclu(nr)==1) if(ciclu_elementar(nr-1)) cout<<"sirul dat este ciclu elementar"; else cout<<"sirul dat este ciclu neelementar"; else cout<<"sirul dat nu este ciclu"; } Graf complet

20

S se verifice dac un graf dat prin matricea de adiacent este graf complet i s se afieze un mesaj corespunztor. Mai jos este o solutie posibil a problemei. Se citete matricea de adiacent cu ajutorul functiei citire(). Functia graf_complet() verific dac deasupra diagonalei principale a matricii de adiacent se afl elemente egale cu zero, tiind c zero nseamn c nu exist muchie ntre dou noduri. #include<iostream.h> int n, mat[10][10]; void citire() {int i,j; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) {cout<<"mat["<<i<<"]["<<j<<"]=";cin>>mat[i][j]; mat[j][i]=mat[i][j];} } int graf_complet() {int i,j; for(i=1;i<n;i++) for(j=i+1;j<=n;j++)if(mat[i][j]==0) return 0; return 1; }

21

void main() { cout<<"n=";cin>>n; citire(); if(graf_complet()==1) cout<<"graful dat prin matricea de adiacenta este complet"; else cout<<"graful dat prin matricea de adiacenta NU este complet"; }

Graf conex

S se verifice dac un graf dat prin matricea de adiacent este graf conex i s se afieze un mesaj corespunztor. #include<iostream.h> int mat[10][10],n,v[10]; void citire() { int i,j; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) {cout<<"mat["<<i<<"]["<<j<<"]="; cin>>mat[i][j];
22

mat[j][i]=mat[i][j]; } } void parcurg(int x) { int i; v[x]=1; for(i=1;i<=n;i++) if(mat[x][i]&&v[i]==0) parcurg(i); } int conex() { int i; parcurg(1); for(i=1;i<=n;i++) if(v[i]==0) return 0; return 1; } void main() {cout<<"n="; cin>>n; citire(); if(conex()==1) cout<<"Graful dat este conex";
23

else cout<<"Graful dat NU este conex"; }

Parcurgerea in adancime Se citete matricea de adiacent a unui graf neorientat. S se afieze nodurile grafului pentru parcurgerea n adncime, pornind de la un nod citit de la tastatur. #include<iostream.h> int v[10],n,mat[10][10]; void citire_matrice() { int i,j; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) { cout<<"mat["<<i<<"]["<<j<<"]="; cin>>mat[i][j]; mat[j][i]=mat[i][j]; } } void adancime(int n1) { int k; cout<<n1<<" ";

24

v[n1]=1; for(k=1;k<=n;k++) if(mat[n1][k]==1&&v[k]==0) adancime(k); } void main() { int n1; cout<<"n=";cin>>n; citire_matrice(); cout<<"Dati nodul de pornire=";cin>>n1; adancime(n1); }

Parcurgerea In

latime

Se citete matricea de adiacent a unui graf neorientat. S se afieze nodurile grafului pentru parcurgerea n ltime, pornind de la un nod citit de la tastatur. #include<iostream.h> int mat[10][10],n,n1,p,u,c[10],viz[10]; void citire_matrice() { int i,j; for(i=1;i<n;i++)

25

for(j=i+1;j<=n;j++) { cout<<"mat["<<i<<"]["<<j<<"]="; cin>>mat[i][j]; mat[j][i]=mat[i][j]; }} void parcurg(int n1) { int i,j,l1; p=u=1; c[p]=n1; viz[n1]=1; while(p<=u) {l1=c[p]; for(i=1;i<=n;i++) if(mat[l1][i]&&!viz[i]) {viz[i]=1; u++; c[u]=i;;} p++;} } void main() {int i; cout<<"n=";cin>>n;

26

citire_matrice(); cout<<"Dati nodul de pornire=";cin>>n1; parcurg(n1); for(i=1;i<=n;i++) cout<<c[i]<<" "; cout<<endl; }

Bibliografie

http://info-cniv.wikispaces.com 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 http://www.aut.upt.ro/~dberian/Labs/POO.pdf

27