Sunteți pe pagina 1din 22

Noţiuni introductive

Un graf (neorientat sau orientat) este o pereche ordonată de mulţimi .


Mulţimea V este o mulţime nevidă şi finită de elemente denumite vârfurile grafului.
Mulţimea E este o mulţime de perechi de vârfuri din graf.
În cazul grafurilor neorientate, perechile de vârfuri din mulţimea E sunt neordonate şi sunt denumite
muchii. Perechea neordonată formată din vârfurile x şi y se notează ; vârfurile x şi y se numesc
extremităţile muchiei .
În cazul grafurilor orientate, perechile de vârfuri din mulţimea E sunt ordonate şi sunt denumite arce.
Perechea ordonată formată din vârfurile x şi y se notează ; vârful x se numeşte extremitate iniţială a
arcului , iar vârful y se numeşte extremitate finală a arcului .
Dacă există un arc sau o muchie cu extremităţile x şi y, atunci vârfurile x şi y sunt adiacente; fiecare
extremitate a unei muchii/unui arc este considerată incidentă cu muchia/arcul respectiv.
Vom considera că extremităţile unei muchii, respectiv ale unui arc, sunt distincte (adică graful nu conţine
bucle).

Observaţii
1. Cu ajutorul unui graf neorientat putem modela o relaţie simetrică între elementele unei mulţimi, în
timp ce cu ajutorul unui graf orientat modelăm o relaţie care nu este simetrică.
2. Între oricare două vârfuri ale unui graf poate exista cel mult o muchie/arc. Dacă între două vârfuri
există mai multe muchii/arce atunci structura se numeşte multigraf. Nu vom lucra cu structuri multigraf.
3. În practică, informaţiile asociate unui graf pot fi oricât de complexe, dar, pentru a simplifica, vom
considera că vârfurile grafului sunt etichetate cu numere naturale de la 1 la n (unde cu n vom nota
numărul de vârfuri din graf). Această numerotare nu este o restrângere a generalităţii (de exemplu,
numărul vârfului poate fi considerat poziţia pe care sunt memorate într-un vector informaţiile asociate
vârfului).
4. În unele lucrări de specialitate, un vârf al grafului se numeşte nod.

1. Reprezentare vizuală a grafurilor


 Fiecărui vârf din graf îi corespunde un punct în plan care are asociat numărul vârfului. Pentru o
mai mare lizibilitate, un vârf se reprezintă ca un cerc sau pătrat în interiorul căruia se specifică
numărul vârfului.
 Dacă graful este neorientat, vom reprezenta fiecare muchie ca o linie (dreaptă sau curbă), care
uneşte cele două extremități ale muchiei.
 Dacă graful este orientat, vom reprezenta fiecare arc ca o săgeată (dreaptă sau curbă) dinspre
extremitatea iniţială către extremitatea finală a arcului.
Graf neorientat . Graf orientat .
, ,

1 2 1 2

6 6
3 3
4 5 4 5
Figura 1 Figura 2
Graf neorientat Graf orientat
Elemente de teoria grafurilor - Noţiuni introductive

2. Gradul unui vârf

Fie un graf neorientat. Se numeşte grad al unui vârf x numărul de muchii


incidente cu vârful respectiv. Gradul vârfului x se notează .
Se numeşte vârf izolat un vârf care are grad 0.
Se numeşte vârf terminal un vârf cu gradul 1.
De exemplu, pentru graful din figura 1:

x 1 2 3 4 5 6
3 2 1 1 3 0 Vârfuri izolate: 6
Vârfuri terminale: 3, 4

Fie un graf orientat şi x un vârf din graf.


Gradul exterior al vârfului x se notează şi este egal cu numărul de arce care au
ca extremitate iniţială pe x.
Gradul interior al vârfului x se notează şi este egal cu numărul de arce care au
ca extremitate finală pe x.
De exemplu, pentru graful din figura 2:

x 1 2 3 4 5 6
2 1 0 1 2 0
1 1 1 1 2 0
Observaţii
1. Suma gradelor unui graf neorientat este egală cu dublul numărului de muchii din
graf.
2. Suma gradelor interioare ale vârfurilor unui graf orientat este egală cu suma
gradelor exterioare ale vârfurilor grafului şi este egală cu numărul de arce din
graf.

3. Lanţ, ciclu, drum, circuit


Se numeşte lanţ într-un graf neorientat, o secvenţă de vârfuri , cu
proprietatea că oricare două vârfuri consecutive din secvenţă sunt adiacente.
Un lanţ este elementar dacă el nu conţine de mai multe ori acelaşi vârf.
Un lanţ este simplu dacă el nu conţine de mai multe ori aceeaşi muchie.
Se numeşte ciclu un lanţ simplu pentru care extremitatea iniţială coincide cu extremitatea
finală. Ciclul se numeşte elementar dacă nu conţine de mai multe ori acelaşi vârf (exceptând
extremităţile sale).
Se numeşte lungime a unui lanţ numărul de muchii conţinute.

De exemplu, pentru graful neorientat din figura 1:


Lanţ: - lungime 8.
Lanţ elementar: - lungime 3, - lungime 4.
Lanţ simplu: , .
Ciclu: .
Ciclu elementar: .

2
Elemente de teoria grafurilor - Noţiuni introductive

Se numeşte drum într-un graf orientat o secvenţă de vârfuri , astfel încât


pentru oricare două vârfuri consecutive şi există arcul .
Drumul se numeşte elementar dacă nu conţine de mai multe ori acelaşi vârf.
Drumul se numeşte simplu dacă nu conţine de mai multe ori acelaşi vârf.
Se numeşte circuit un drum simplu pentru care extremitatea iniţială coincide cu
extremitatea finală. Circuitul se numeşte elementar dacă nu conţine de mai multe ori acelaşi vârf
(exceptând extremităţile sale).
Se numeşte lungime a unui drum numărul de arce conţinute.

De exemplu, pentru graful orientat din figura 2:


Drum: – lungime 4.
Drum elementar: – lungime 3.
Drum simplu: ,
Circuit:
Circuit elementar: .

Un lanţ/drum/ciclu/circuit elementar se numeşte hamiltonian dacă el trece prin toate


vârfurile grafului.
Un lanţ/drum/ciclu/circuit elementar se numeşte eulerian dacă el trece prin fiecare
muchie/arc a/al grafului o singură dată.

4. Grafuri asociate unui graf dat

Fie un graf orientat sau neorientat.

Graful se numeşte graf parţial al lui G dacă .


Observaţie: Un graf parţial al lui G se obţine eliminând muchii/arce din graful G.
1 2 1 2

6 6
3 3

4 5 4 5
Figura 3 Figura 4
Graf parţial obţinut din graful din figura 1 Graf parţial obţinut din graful din figura 2
prin eliminarea muchiilor . prin eliminarea arcelor , .

Graful se numeşte subgraf al lui G dacă , iar este mulţimea


tuturor muchiilor/arcelor din E cu proprietatea că au ambele extremităţi în .
Se spune că subgraful este indus (sau generat) de mulţimea de vârfuri .
Observaţie: Un subgraf al lui G se obţine eliminând vârfuri din graful G împreună cu toate
muchiile/arcele incidente cu acestea.

3
Elemente de teoria grafurilor - Noţiuni introductive
1 2 2

6
3
4 4 5

Figura 5 Figura 6
Subgraf obţinut din graful din figura 1 prin Subgraf obţinut din graful din figura 2
eliminarea vârfului 5 şi a tuturor muchiilor prin eliminarea vârfurilor 1, 3 şi 6 şi a
incident cu acesta: . tuturor arcelor incidente cu acestea:
, .

Graful se numeşte subgraf parţial al lui G dacă , iar este


inclusă în mulţimea tuturor muchiilor/arcelor din E cu proprietatea că au extremităţile în .
Observaţie: Un subgraf parţial al lui G se obţine eliminând vârfuri din graful G, toate
muchiile/arcele incidente cu vârfurile eliminate, precum şi alte muchii/arce din graf.
1 2 2

6
3
4 4 5
Figura 7 Figura 8
Subgraf parţial obţinut din graful din figura 1 Subgraf parţial obţinut din graful din
prin eliminarea vârfului 5 şi a muchiilor figura 2 prin eliminarea vârfurilor 1, 3 şi 6
. şi a arcelor , .
Exerciţii

Fie G un graf orientat sau neorientat cu n vârfuri şi m muchii/arce.

1. Numărul de grafuri parţiale ale lui G este .


Soluţie: Numerotăm muchiile grafului de la 1 la m. Fiecărui graf parţial îi putem
asocia în mod biunivoc o funcţie astfel:
dacă muchia numerotată i aparţine grafului parţial

Numărul de grafuri parţiale este egal cu numărul de funcţii definite, adică


(considerăm că un graf este parţial al său).

2. Numărul de subgrafuri ale lui G este .


Soluţie: Pentru a genera un subgraf, trebuie să selectăm mulţimea vârfurilor sale,
mulţimea muchiilor/arcelor fiind unic determinată de mulţimea vârfurilor
selectate. Mulţimea are submulţimi, dintre care trebuie să eliminăm
mulţimea vidă. Deci, există subgrafuri ale unui graf cu n vârfuri
(considerăm că un graf este subgraf al său).

4
Elemente de teoria grafurilor - Noţiuni introductive

Fie un graf orientat.


Graful se numeşte graf transpus al grafului G 1 2
dacă .
6
3
Figura 9
4 5
Graful transpus al grafului orientat din figura 2

5. Tipuri speciale de grafuri

Graf complet
Un graf orientat sau neorientat se numeşte complet dacă oricare două vârfuri din graf
sunt adiacente.
Observaţie: Graful neorientat complet cu n vârfuri se notează şi conţine muchii.

2
1 1 2

2 3 4 3 1

4
Figura 10
Grafuri neorientate complete cu 3, 4 şi 5 vârfuri 5
Pentru un număr de vârfuri fixat, graful neorientat este unic, dar grafurile orientate
complete sunt mai multe.
1 2 1 2

Figura 11
4 3 4 3
Grafuri orientate complete cu 4 vârfuri

Graf antisimetric
Un graf orientat se numeşte antisimetric dacă pentru oricare două vârfuri din graf x şi y
dacă există arcul , atunci nu există arcul
Observaţie: Orice relaţie de ordine între elementele unei mulţimi poate fi modelată cu
ajutorul unui graf orientat asimetric (vârfurile grafului corespund elementelor mulţimii; dacă
elementul x este în relaţia de ordine respectivă cu elementul y, atunci în graf va exista arcul
; graful astfel definit este antisimetric, deoarece relaţia de ordine este antisimetrică).
Graful din figura 9 nu este antisimetric deoarece există vârfurile 4 şi 5 pentru care avem
arcele şi .

Graf turneu
Un graf orientat complet şi antisimetric se numeşte graf turneu.
5
Elemente de teoria grafurilor - Noţiuni introductive

Graf bipartit
Un graf neorientat se numeşte bipartit dacă mulţimea vârfurilor sale poate fi
partiţionată în două submulţimi A şi B nevide ( ) astfel încât orice muchie
are o extremitate în A şi una în B.
4
1

5
Figura 12 2
Graf bipartit
6
3

7
Graf bipartit complet
Un graf bipartit se numeşte complet dacă fiecare vârf din mulţimea A este adiacent cu
fiecare vârf din mulţimea B.
Observaţie: Dacă numărul de vârfuri din mulţimea A este p, iar numărul de vârfuri din
mulţimea B este q, graful bipartit complet se notează şi conţine muchii.

Graf regulat
Un graf neorientat se numeşte regulat dacă toate vârfurile sale au același grad.
2

Figura 13 4
Graf regulat
5

6
Parcurgerea grafurilor
Parcurgerea unui graf presupune examinarea sistematică a vârfurilor grafului, cu scopul prelucrării
informaţiilor asociate vârfurilor.
Există două metode fundamentale de parcurgere a grafurilor:
1. Parcurgerea în adâncime (DFS – Depth First Search)
2. Parcurgerea în lăţime (BFS – Breadth First Search)

Parcurgerea în adâncime
Parcurgerea în adâncime se caracterizează prin faptul că se merge „în adâncime” ori de câte ori este posibil.
 Parcurgerea începe cu vârful iniţial, denumit vârful de start, care este şi vizitat.
 Se vizitează apoi primul vecin nevizitat al vârfului de start. Vârful y este considerat vecin al vârfului x
dacă exisă muchia (pentru graful neorientat), respectiv arcul (pentru graful orientat).
 Se vizitează în continuare primul vecin nevizitat al primului vecin al vârfului de start, şi aşa mai
departe, mergând în adâncime, până când ajungem într-un vârf care nu mai are vecini nevizitaţi.
Când ajungem într-un astfel de vârf, revenim la vârful său părinte (vârful din care acest nod a fost
vizitat). Dacă acest nod mai are vecini nevizitaţi, alegem primul vecin nevizitat al său şi continuăm
parcurgerea în acelaşi mod. Dacă nici acest vârf nu mai are vecini nevizitaţi, revenim în vârful său
părinte şi continuăm în acelaşi mod, până când toate vârfurile accesibile din vârful de start sunt
vizitate.

Parcurgerea în lăţime

 Parcurgerea în lăţime începe cu vârful iniţial, denumit şi vârful de start. Se vizitează mai întâi vârful
de start.
 Se vizitează în ordine toţi vecinii nevizitaţi ai vârfului de start.
 Apoi se vizitează în ordine toţi vecinii nevizitaţi ai vecinilor vârfului de start şi aşa mai departe, până
la epuizarea tuturor vârfurilor accesibile din vârful de start.

Observaţii
1. Parcurgerea în lăţime are o proprietate remarcabilă: fiecare vârf este vizitat pe cel mai scurt lanţ/drum,
începând din vârful de start.
2. Complexitatea timp a algoritmilor de parcurgere în adâncime şi în lăţime a unui graf depinde de
modalitatea de reprezentare a acestuia. În cazul reprezentării prin liste de adiacenţă, complexitatea este
. În cazul reprezentării prin matrice de adiacenţă este .

1 2 3

Parcurgerea în adâncime
4 5

6 7 11

9 10 12 Parcurgerea în lăţime
Conexitate
Graful neorientat se numeşte conex dacă pentru oricare două vârfuri x şi y
există lanţ între x şi y.
Se numeşte componentă conexă a grafului G un subgraf conex maximal cu această
proprietate (adică, dacă am mai adăuga un vârf şi toate muchile incidente cu acesta, subgraful
obţinut nu ar mai fi conex).

Graful orientat se numeşte tare conex dacă pentru oricare două vârfuri x şi y
există drum de la x la y şi drum de la y la x.
Se numeşte componentă tare-conexă a grafului G un subgraf tare-conex maximal cu
această proprietate (adică, dacă am mai adăuga un vârf şi toate arcele incidente cu acesta,
subgraful obţinut nu ar mai fi tare-conex).

Observaţii
1. Orice graf neconex/ ne-tare-conex conține cel puţin două componente conexe.
2. Componentele conexe/tare-conexe ale unui graf sunt disjuncte.
3. Componentele conexe/tare-conexe conţin o partiţie a mulţimii vârfurilor grafului.
4. Vârful izolat este o componentă conexă/tare-conexă a unui graf.

Descompunerea unui graf în componente conexe/tare-conexe


Descompunerea unui graf în componente conexe/tare-conexe înseamnă a determina toate
componentele conexe/tare-conexe.
A determina componenta conexă/tare-conexă a unui vârf x presupune a determina toate
vârfurile accesibile din vârful x. Deci, este suficient să realizăm o parcurgere a grafului (în lățime
sau adâncime) cu vârful de start x.
Pentru a descompune graful în componente conexe/tare-conexe, vom realiza câte o
parcurgere pentru fiecare componentă conexă (selectând ca vârf de start primul vârf nevizitat).
Grafuri neorientate

1. Graf partial
Fie G=(A,B) si G1=(A1,B1).
Spunem că G1 este un graf parţial al lui G dacă A=A1 şi B1 este inclus sau egal cu B.
Un graf parţial se obţine dintr-un graf, îndepărtând o parte dintre muchiile sale şi păstrând toate
nodurile acestuia.

Exemplu 1:

Graful iniţial Da

Da Nu (are o muchie în plus)

Da
2. Subgraful unui graf
Fie G=(A,B) şi G1=(A1,B1);
A1 inclus sau egal cu A; B1 inclus sau egal cu B.
B1 = {(x,y) / oricare x,y aparţine A1 dacă (x,y) aparţine de B => (x,y) aparţine de B1}
Subgraful se obţine din graful iniţial selectând o parte din nodurile sale şi o parte din nodurile
adiacente cu acesta.

Exemplu 2:

Graful iniţial Nu (nu are toate muchiile)

Da
3. Graf complet
Un graf este complet dacă oricare două vârfuri distince sunt
adiacente.
Exemplu 3:

Un graf neorientat cu n noduri are n(n-1)/2 muchii.


Există un singur graf complet neorientat cu n noduri.
Există mai multe grafuri orientate complete cu n noduri.
4. Grafuri bipartite
Fie G=(A,B) neorientat.
G este bipartit dacă există două mulţimi, A1 şi A2 astfel încât A1 ∩ A2 = Ø şi A1 U A2 = A, iar
oricare muchie (x,y) aparţinând lui B are un capăt în mulţimea A1 şi celălalt în A2.

Exemplu 4:

Un graf bipartit este bipartit complet dacă fiecare nod din mulţimea A1 este adiacent cu toate
nodurile din A2 şi reciproc.

Exemplu 5:
5. Grafuri conexe
Un graf este conex dacă este format dintr-un singur nod sau dacă între oricare două noduri ale
sale există cel puţin un lanţ.

Exemplu 6:

Da
Probleme rezolvate

1) Sa se verifice daca un graf neorientat este complet.

#include<iostream>

int n,i,j,m,a[10][10];

int main()
{
cout<<"Dati nr. de vf. ";cin>>n;
cout<<"Dati elementele matricei de adiacenta"<<endl;
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];
}
// determinarea nr. de muchii
m=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==1) m++;
m=m/2;
if(m == n * (n-1)/2)
cout<<"Graf complet";
else
cout<<"Graful nu este complet";
}
2) Sa se verifice daca o succesiune de varfuri date este ciclu pentru un graf. In caz afirmativ, sa
se stabileasca daca este ciclu elementar sau nu.

#include<iostream>
int n,i,j,m,a[10][10],x[50];
int main()
{
cout<<"Dati nr. de vf. ";cin>>n;
cout<<"Dati elementele matricei de adiacenta"<<endl;
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];
}
// citirea succesiunii de vf.
cout<<"Dati nr. de muchii ";cin>>m;
for(i=1;i<=m;i++)
{
cout<<"x["<<i<<"]=";
cin>>x[i];
}
// verificare daca este lant: vf. consecutive sa fie muchii in matrice
int lant=1;
for(i=1;i<=n-1;i++)
if(a[x[i]][x[i+1]]==0) lant=0;
// primul si ultimul vf. sunt egale
int ok=1;
if(lant==1)
if(x[1]!=x[m]) ok=0;

// muchii distincte
int ciclu=1;
if(ok==1)
for(i=1;i<=m-2;i++)
for(j=i+1;j<=m;j++)
if(x[i]==x[j] && x[i+1]==x[j+1] || x[i]==x[j+1] && x[i+1]==x[j])
ciclu=0;
// verificare daca este ciclu elementar: vf. sa fie distincte doua cate doua, mai putin
primul si ultimul
if(ciclu==1 && x[1]==x[m])
cout<<"Ciclu elementar";
else
cout<<"Ciclu neelementar";
}
3) Se citesc 2 grafuri neorientate, unul cu n noduri si m muchii, iar celalalt cu k varfuri si l
muchii, ambele date prin vectorul muchiilor. Sa se determine daca al doilea graf este subgraf al
primului.

#include<fstream.h>
fstream f("date.in",ios::in);
fstream g("date2.in",ios::in);

int a[100][100],b[100][100],n,m,k,l;

int subgraf()
{for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
if(a[i][j]!=b[i][j]) return 0;
return 1;
}

int main(void)
{
int x,y,i;
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y;
a[x][y]=1;
a[y][z]=1;
}
g>>k>>l;
for(i=1;i<=l;i++)
{
g>>x>>y;
b[x][y]=1;
b[y][x]=1;
}
}

if(subgraf()) cout<<"da";
else cout<<"nu";
}
4) Memorarea grafurilor neorientate folosind cele trei modalitati de reprezentare:
a) Matrice de adiacenta
b) Vector de muchii
c) Liste de vecini

#include <fstream>
#include <vector>
ifstream fin("date.in");
ofstream fout("date.out");
struct muchie
{
int i,j;
};
int A[50][50]; // matrice de adiacenta
muchie M[1000]; // vector muchiilor
int V1[50], V2[50]; // liste de vecini
int n,m; //n – nr. de noduri, m – nr. de muchii

void citire()
{
int x,y,i;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
M[i].i=x; M[i].j=y;
A[x][y]=A[y][x]=1;
V1[i]=x;
V2[i]=y;
}
}

void afisare()
{
int i,j;
fout<<"matricea de adiacenta:\n";
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
fout<<A[i][j]<<" ";
fout<<endl;
}
fout<<"lista muchiilor:\n";
for(i=1;i<=m;i++) fout<<M[i].i<<" "<<M[i].j<<endl;
fout<<"lista vecinilor:\n";
for(i=1;i<=n;i++)
{
fout<<i<<": ";
fout<<V1[i]<<","<<V2[i]<< " ";
fout<<endl;
}
fin.close();
fout.close();
}

int main()
{
citire();
afisare();
}

5) Se citeste dintr-un fisier de pe primul rand o valoare n reprezentand numarul de noduri pentru
un graf neorientat si de pe urmatoarele n linii si coloane matricea de adiacenta corespunzatoare
grafului.

a) Identificati multimea X
b) Identificati multimea U
c) Calculati gradele nodurilor impare
d) Verificati daca graful are varfuri izolate, daca da afisati nodul, daca nu afisati un mesaj

#include<iostream>
#include<fstream>
int a[20][20];
int main()
{
ifstream f(“matricegraf.in”);
int n,i,j,k;
f>>n;
//a)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
cout<<”X=”;
for(i=1;i<=n;i++)
cout<<i<<” “;
cout<<endl;
//b)
cout<<”U=”;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)

9
if(a[i][j]==1&&i<j) cout<<”(“<<i<<”,”<<j<<”)”;
//c)
for(i=1;i<=n;i++)
{
k=0;
for(j=1;j<=n;j++)
if(i%2==1&&a[i][j]==1) k++;
if(i%2==1) cout<<endl<<”gradul nodului “<<i<<” este “<<k<<endl;
}
//d)
for(i=1;i<=n;i++)
{
r=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) return 0;
}

6) Se citeste din fisierul graf.in de pe prima linie nr de varfuri si numarul de muchii(n,m) de pe


urmatoarele m randuri perechi de varfuri reprezentand muchiile grafului.
Se cere:
a) Sa se construiasca matricea de adiacenta si sa se scrie aceasta in fisierul MAT.OUT
b) calculati gradul fiecarui nod si pastrati acest grad intr-un vector
c) verificati daca graful are varfuri izolate

#include<iostream>
#include<fstream>

int a[20][20],v[40];
int main()
{
ofstream g(“mat.out”);
ifstream f(“graf.in”);
int j,i,n,m,h,r=0,x,y,ok=0;
f>>n;
f>>m;
// a)
for(i=1;i<=m;i++)
{
f>>x;
f>>y;
a[x][y]=a[y][x]=1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
g<<a[i][j]<<” “;
g<<endl;
}
//b)
for(i=1;i<=n;i++)
{
h=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) h++;
r++;
v[r]=h;
}
for(i=1;i<=n;i++)
cout<<”nodul “<<i<<”are rangul “<<v[i]<<endl;
// c)
for(i=1;i<=n;i++)
if(v[i]==0) ok=0;
else ok=1;
if(ok==0) cout<<”Graful are varfuri izolate”<<” “;
else cout<<”Graful nu are varfuri izolate”<<” “;
}

7) Din fisierul GRAF.TXT, cititi de pe primul rand nr de noduri si nr de muchii, si de pe


urmatoarele m randuri perechiile de noduri reprezentand muchiile. Formati matricea de
adiacenta. enumerati nodurile terminale,
nodurile intermediare

#include<iostream>
#include<fstream>

int a[20][20];
int main()
{
int i,j,n,m,x,y,k;
ifstream f(“graf.txt”);
f>>n;
f>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
f>>x; f>>y;
a[x][y]=1;
a[y][x]=1;}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<” “;
cout<<endl;
}
for(i=1;i<=n;i++)
{
k=0;
for(j=1;j<=n;j++)
if(a[i][j]==1) k++;
if(k==1) cout<<”Nod terminal =”<<i<<endl;
if(k>1) cout<<”Nod intermediar= “<<i<<endl;
}
}

Probleme propuse spre rezolvare

1. Să se ruleze programele prezentate mai sus, urmărind apelurile şi valorile parametrilor de apel.

2. Se citeste un graf de la tastatura: numarul de noduri, numarul de muchii si muchiile.


a) sa se afiseze matricea de adiacente
b) Sa se determine gradul unui nod citit
c) Sa se afiseze pentru un nod citit nodurile adiacente
d) sa se afiseze nodurile incidente cu cea de a x muchie din matrice
e) sa se afiseze pentru fiecare nod gradul
f) sa se afiseze nodul (nodurile) avand cei mai multi vecini
g) sa se afiseze nodurile izolate

3. Sa se determine daca o matrice citita de la tastatura poate fi matricea unui graf neorientat. In
caz afirmativ se va determina cate muchii are graful.

4. Sa se faca un program de numarare a gradelor fiecarui vârf dintr-un graf. Sa se determine apoi:
a) daca exista vârfuri izolate si vârfuri terminale;
b) toate vârfurile de grad maxim.

5. Sa se determine toate grafurile partiale ale unui graf.

6. Doua grafuri G=(X,U) si H=(Y,V) se numesc izomorfe daca exista o bijectie f: XY
astfel încât [x,y]U daca si numai daca [f(x),f(y)] V. Deci doua grafuri izomorfe au acelasi
numar de vârfuri si se obtin unul din celalalt printr-o renumerotare a vârfurilor. Sa se faca un
program care sa verifice daca doua grafuri sunt izomorfe.

7. Fiind dat un graf G = (X, U), sa se determine un lant simplu de lungime maxima.

8. Fiind dat un graf G = (X, U), sa se faca un program care sa verifice daca graful este bipartit
complet.

9. Sa se faca un program de generare a tuturor ciclurilor unui graf. Observatie: puteti adapta
programul realizat pentru generarea tuturor ciclurilor elementare.

10. Fie G un graf neorientat, cu n vârfuri şi m muchii, reprezentat prin matricea de adiacenţă. Să
se realizeze programe, în C/C++, care:
a) afişează gradele tuturor vârfurilor;
b) afişează vârfurile de grad par;
c) afişează vârfurile izolate;
d) afişează vârfurile terminale;
e) verifică dacă graful are vârfuri izolate;
t) verifică dacă graful are vârfuri terminale;
g) verifică dacă graful are vârfuri interioare (nu sunt nici izolate nici terminale);
h) verifică dacă graful are toate vârfurile izolate;
i) verifică dacă graful are toate vârfurile interioare (nu sunt nici izolate nici terminale):
j) afişează gradul unui vârf dat:
k) afişează vecinii unui nod dat, vf;
l) verifică dacă un vârf dat este terminal, izolat sau interior;
m) afişează gradul cel mai mare şi toate vârfurile care au acest grad
n) afişează frecventa vârfurilor:
 izolate: n1
 terminale: n2
 interioare: n3
o) fiind dat şirul g1, ...,gn, să se verifice dacă poate reprezenta şirul gradelor vârfurilor în
această ordine;
p) fiind dat şirul g1 ...,gn, să se verifice dacă poate reprezenta şirul gradelor vârfurilor (nu
neapărat în această ordine).

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