Documente Academic
Documente Profesional
Documente Cultură
Grafuri
Grafuri
PROIECT ATESTAT
INFORMATICA
TEMA:
GRAFURI
NEORIENTATE
CUPRINS
Terminologie ..
pag.4
Tipuri de grafuri ..
pag. 6
Metode de reprezentare .
. pag. 12
Metode de parcurgere
. pag. 14
Exercitii si probleme
... pag. 15
Bibliografie
pag.30
Grafurile pot fi aplicate cu succes pentru a modela probleme specifice analizei circuitelor electrice, gsirea
celui mai scurt drum, analiza planificrii proiectelor, critica textelor literare, reele sociale, aplicaii din
domeniul chimiei i economiei.
I. Terminologie
Definiii: Se numete graf neorientat o pereche ordonat de mulimi G=(X, U), unde: X = {x 1, x2,
x3, , xn}este o mulime finit i nevid de elemente numite noduri sau vrfuri, iar
U o mulime finit de perechi neordonate de forma (xi, xj), unde ij i xi, xj X, numite
muchii. O muchie unete dou noduri.
X = mulimea nodurilor sau vrfurilor, iar U = mulimea muchiilor grafului G. Un
vecin al unui vrf este orice vrf care este adiacent lui n graf.
O muchie u U este deci o submulime {x, y} de vrfuri distincte din X i se noteaz u = [x, y]. x i y
sunt adiacente n G, iar u i x sunt incidente la fel ca u i y. x i y se numesc extremitile muchiei u.
Dac u1 i u2 sunt 2 muchii care au o extremitate comun, ele se numesc incidente.
Mulimea muchiilor are proprietatea de simetrie, deoarece [x, y] U dac i numai dac
[y,x] U.
10
8
6
5
2
7
4
11
Definiii: Gradul unui vrf x este numrul muchiilor incidente cu x. Se noteaz cu d (x) (d =
degree).
Un vrf care are gradul 0 (deci pentru care nu exist vreo muchie incident cu el) se numete vrf
izolat. Un vrf care are gradul 1 (deci care este incident cu o singur muchie) se numete vrf terminal.
Exemplu: Pentru graful G definit anterior, d (11) = 0, deci vrful 11 este izolat.
Fie un graf neorientat cu n noduri i m muchii. Dac notm cu d1, d2, d3, , dn gradele celor n
noduri, atunci avem relaia:
d1 + d2 + d3 + + dn = 2m
Definiii: Se numete lan L = [x0, x1, , xn]o succesiune de vrfuri cu proprietatea c oricare dou
vrfuri consecutive sunt adiacente.
Vrfurile x0 i xn se numesc extremitile lanului. Numrul n se numete lungimea lanului i este
numrul de muchii din care este format.
Lanul care conine numai vrfuri distincte, dou cte dou, este lan elementar.
Lanul care conine numai muchii distincte este lan simplu. Dac muchiile unui lan nu sunt
distincte se numete lan compus.
O matrice ptratic de ordin n se numete matricea lanurilor, dac:
0, n caz contrar
1
6
2
5
3
ciclul se numete
elementar.
Lungimea unui ciclu nu poate fi 2.
Un ciclu se numete par dac lungimea sa este par i impar n caz contrar.
Exemplu: n graful din figura anterioar lanul 3, 4, 5, 3 este un ciclu elementar impar. Lanul 2, 5,
3, 4, 5, 6, 2 este un ciclu par, dar nu este elementar.
Un graf parial al unui graf se obine pstrnd aceeai mulime de vrfuri i eliminnd o parte
din muchii. Graful parial G1 este indus de mulimea de muchii V.
Un graf neorientat cu n noduri are 2
m
mulimii muchiilor {1, 2, , m},
10
8
6
2
7
11
3
Definiie: Un subgraf al grafului G = (X, U) este un graf H = (Y, V) a.. Y X, iar V conine
toate muchiile din U care au ambele extremiti n Y. Subgraful H este indus sau generat de
mulimea de vrfuri Y.
Exemplu: Pentru graful G definit anterior, dac Y = {1, 2, 3, 7, 10} i
V = {[1, 2], [1, 10], [2, 10], [3, 7]}, atunci H = (Y, V) este un subgraf al grafului G.
1
10
3
2
Un subgraf al unui graf se obine eliminnd o parte din vrfuri i toate muchiile incidente cu
acestea.
Definiii: Un graf fr cilcuri se numete graf aciclic. Un graf aciclic i conex este un arbore. n
cazul grafului aciclic fiecare component conex este un arbore. Un graf neorientat aciclic, care s-ar
putea s nu fie conex, se numete pdure.
Exemplu: Graful de mai jos este aciclic i formeaz o pdure. Cele 3 componente conexe sunt
arbori.
4
10
8
2
Definiie: Se numete graf complet cu n vrfuri un graf cu proprietatea c oricare dou noduri
distincte sunt adiacente. Un graf complet cu n vrfuri se noteaz Kn.
ntr-un graf complet, gradul oricrui nod este n - 1, pentru c din/n fiecare nod pleac/sosesc
n - 1 muchii.
2
ntr-un graf complet, avem relaia: m = n(n - 1)/2 = C n (numrul de submulimi cu 2
elemente ale mulimii celor n noduri), unde m este numrul de muchii, iar n numrul de noduri.
Definiie: Un graf G = (X, U) se numete bipartit dac exist 2 mulimi nevide A i B a.. X =
A B, A B = i orice muchie u a lui G are o extremitate n A iar cealalt n B. Mulimile A i
B formeaz o partiie a lui X.
Un graf este bipartit dac i numai dac nu conine cicluri de lungime impar.
Exemplu: A = {1, 3, 4} i B = { 2, 5, 6, 7}.
2
1
3
6
4
7
Definiie: Un graf bipartit se numete complet dac pentru x A i y B, n G muchia
[x, y]. Notaia este Kp,q unde p i q sunt elementele mulimii A i respectiv ale mulimii B.
2
6
3
Definiie: Un graf n care toate nodurile au acelai grad se numete graf regulat.
Exemplu: Graful definit mai jos este regulat.
1
2
5
3
Definiie: Un graf se numete graf conex dac pentru oricare dou vrfuri x i y diferite ale
sale, exist un lan care le leag, adic x este extremitatea iniial i y este extremitatea final.
Un graf cu un singur nod este, prin definiie, conex.
Se numete component conex a unui graf G = (X,U) un subgraf H = (Y, V), conex, al lui G
care are prorpietatea c nu exist nici un lan n G care s lege un vrf din Y cu un vrf din X Y.
Un graf este conex dac admite o singur componet conex.
Exemplu: Graful definit mai jos are o singur component conex i n consecin este conex.
1
2
5
3
Definiie: Un graf este biconex dac este conex i pentru orice vrf eliminat subgraful generat
i pstreaz proprietatea de conexitate.
Exemplu: Graful definit mai jos este biconex.
1
2
5
3
Definiii: Un multigraf seamn cu un graf neorientat, ns poate avea att muchii multiple
ntre vrfuri ct i autobucle. Un hipergraf seamn cu un graf neorientat, dar fiecare
hipermuchie, n loc de a conecta dou vrfuri, conecteaz o submulime arbitrar de vrfuri.
Definiie: Costul unui graf este o funcie definit pe mulimea muchiilor grafului cu valori n
mulimea numerelor reale. Un graf notat cu o astfel de funcie este notat sub forma: G = (X, U, c).
Exemplu: G = (X, U, c). este graful:
6
5
2
6
Definiie: Se numete ciclu hamiltonian un ciclu elementar care trece prin toate vrfurile
grafului. Un graf care admite un ciclu hamiltonian se numete graf hamiltonian.
Fie G = (X,U) un graf neorientat i un lan elementar care trece prin toate nodurile grafului [x 0,
x1, , xn]. Dac d(x1) + d(xn)n atunci graful este hamiltonian.
Fie G = (X,U) un graf neorientat cu n noduri. Dac pentru orice pereche de noduri neadiacente
xixj, avem relaia d(xi) + d(xj)n atunci graful este hamiltonian.
Dac G = (X,U) este un graf neorientat cu n noduri i gradul oricrui vrf este mai mare sau
egal n/2, atunci G este hamiltonian.
Un graf G este hamiltonian dac are n3 vrfuri i gradul oricrui vrf verific inegalitatea:
d(x)n/2.
1
8
4
5
6
Definiie: Un lan al unui graf care conine fiecare muchie o dat i numai o dat se numete
lan eulerian. Dac x0 = xn i lanul este eulerian atunci, ciclul respectiv se numete ciclu eulerian.
Un graf care conine un ciclu eulerian se numete graf eulerian.
Dac este eulerian nu nseamn c nu are vrfuri izolate.
1
8
4
5
6
Un graf G = (X,U), fr vrfuri izolate, este eulerian dac i numai dac este conex i
gradele tuturor vrfurilor sale sunt numere pare.
1. Matrice de adiacen
0, pentru [i, j] U
2
7
5
6
8
A=
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
1
0
1
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
1
0
1
0
0
0
0
0
0
0
1
0
Pentru fiecare nod i, o list liniar simplu nlnuit va reine toate nodurile j pentru care [i,
j] U, adic lista succesorilor.
Fiecare list simplu nlnuit conine nodurile n ordinea invers introducerii lor.
3. Matricea costurilor
4. Lista muchiilor
Se face ncepnd de la un anumit nod, parcurgem apoi toi descendenii si, apoi toi descendenii
nodurilor parcuse la pasul anterior, s.a.m.d. Un nod este parcurs o singur dat. Exist mai multe soluii
ale unei astfel de parcurgeri pentru c ordinea de parcurgere a desendenilor unui nod nu este impus, ea
depinde i de modul n care a fost memorat graful.
6
5
3
7
Se face ncepnd de la un anumit nod, parcurgem apoi primul dintre descendenii si, neparcuri
nc s.a.m.d. Un nod este parcurs o singur dat i aici exist mai multe soluii de parcurgere.
2
4
6
5
3
7
V.Exercitii si problem
Se da un numar n si n valori intregi. Determinati daca cele n valori pot reprezenta
fout.close();
return 0;
}
fout<<"\n";
}
}
int i,j,k=1;
fin>>n;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
M[k].i=i; M[k].j=j; k++;
}
m=n*(n-1)/2;
Sub(1,m);
fin.close();
fout.close();
return 0;
Calculati
si
b)
Numarati
cate
c)
Afisati
REZOLVARE:
varfurile
afisati
varfuri
care
gradul
terminale
au
fiecarui
are
grad
varf.
graful.
maxim.
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int D[50];//vectorul gradelor
int n,m;
void citire()
{
int x,y,i;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
D[x]++;
D[y]++;
}
}
void afis()
{
int i,j;
fout<<"vectorul gradelor:\n";
for(i=1;i<=n;i++) fout<<D[i]<<" ";
fout<<endl;
fout<<"numarul de noduri terminale:\n";
int k=0;
for(i=1;i<=n;i++) if(D[i]==1) k++;
fout<<k<<endl;
fout<<"nodurile cu grad maxim:\n";
int maxx=0;
for(i=1;i<=n;i++) if(D[i]>maxx) maxx=D[i];
fin>>i>>j;
a[i][j]=1;
a[j][i]=1;
}
}
void rf()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}
void afis()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(a[i][j]!=maxx) fout<<a[i][j]<<" ";
else fout<<"# ";
fout<<"\n";
}
}
int main()
{
citire();
rf();
afis();
fin.close();
fout.close();
return 0;
}
Se da un graf neorientat cu n varfuri si m muchii, citit prin vectorul muchiilor si apoi
un
varf
k.
lant
care
uneste
fin>>i>>j;
a[i][j]=1;
a[j][i]=1;
}
fin>>k;
}
void bf(int k)
{
int st,dr,j;
st=dr=1;
cele
doua
noduri.
x[1]=k;
p[k]=1;
d[k]=0;
while(st<=dr)
{
for(j=1;j<=n;j++)
if(a[x[st]][j]==1 && p[j]==0)
{
dr++;
x[dr]=j;
p[j]=1;
d[j]=d[x[st]]+1;
}
st++;
}
}
void afis()
{
int i;
for(i=1;i<=n;i++)
if(d[i]!=100000) fout<<i<<" "<<d[i]<<endl;
else fout<<i<<" -\n";
}
int main()
{
citire();
for(int i=1;i<=n;i++) d[i]=100000;
bf(k);
afis();
fin.close();
fout.close();
return 0;
}
de
[1,2][1,3][1,4]
[1,3][3,4]
[1,4] [3,4]
REZOLVARE:
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int n,m,a[100][100];
void citire()
{
fin>>n>>m;
for(int i=0;i<=m;i++)
{
int x,y;
fin>>x>>y;
a[x][y]=a[y][x]=1;
}
}
int grad(int v)
{
int g=0;
for(int i=1;i<=n;i++)
muchii
incidente
sunt
g=g+a[v][i];
return g;
}
int main()
{
citire();
for(int i=1;i<=n;i++)
if(grad(i)>=2)
{
for(int j=1;j<=n;j++)
if(a[i][j]==1) fout<<"["<<i<<","<<j<<"] ";
fout<<endl;
}
fin.close();
fout.close();
return 0;
}
Se da un graf neorientat cu n noduri si m muchii precizat prin lista muchiilor. Calculati
distantele minime dintre oricare doua noduri ale grafului si afisati distantele intr-o
matrice A (nXn) in care fiecare element A[x][y] este egal cu distanta minima de la
varful x la varful y. Distanta minima dintre doua varfuri este egala cu lungimea celui
mai scurt lant care are cele doua noduri ca extremitati. Se va folosi parcurgerea in
latime.
REZOLVARE:
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
for(int i=1;i<=m;i++)
{
int x,y;
fin>>x>>y;
A[x][y]=A[y][x]=1;
}
}
void BF(int s)
{
int C[100]={0};
int d[100]={0};
int st,dr,i;
C[1]=s;
d[s]=1;
st=dr=1;
while(st<=dr)
{
for(i=1;i<=n;i++)
if(A[C[st]][i] && d[i]==0)
{
dr++;
C[dr]=i;
d[i]=d[C[st]]+1;
}
st++;
}
for(i=1;i<=dr;i++) D[s][C[i]]=d[C[i]]-1;
}
int main()
{
citire();
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) D[i][j]=-1;
for(i=1;i<=n;i++) BF(i);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(D[i][j]!=-1) fout<<D[i][j]<<" ";
else fout<<"# ";
fout<<endl;
}
fin.close();
fout.close();
return 0;
}
Se da un graf neorientat cu n noduri si m muchii precizat prin lista muchiilor. Calculati
distantele minime de la un nod citit s la toate celelalte noduri ale grafului. Distanta
minima dintre doua varfuri este egala cu lungimea celui mai scurt lant care are cele
doua noduri ca extremitati.
REZOLVARE:
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int V[50][50];//listele de adiacenta
int n,m,s;//noduri/muchii/start
int p[50];//0 sau 1
int D[50];//distantele minime
void citire()
{
int x,y,i;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>x>>y;
V[x][0]++; V[x][V[x][0]]=y;
V[y][0]++; V[y][V[y][0]]=x;
}
fin>>s;
}
void BF(int s)
{
int st,dr,i,x[50],j;
st=dr=1;
p[s]=1;
x[1]=s;
D[s]=0;
while(st<=dr)
{
for(i=1; i<=V[x[st]][0]; i++)
{
j=V[x[st]][i];
if(!p[j])
{
dr++;
x[dr]=j;
p[j]=1;
D[j]=D[x[st]]+1;
}
}
st++;
}
for(i=1;i<=dr;i++) fout<<s<<"->"<<i<<":"<<D[i]<<endl;
}
int main()
{
citire();
BF(s);
fin.close();
fout.close();
return 0;
}