Sunteți pe pagina 1din 29

LICEUL COLEGIUL NATIONAL GEORGE COSBUC MOTRU

PROIECT ATESTAT
INFORMATICA

ELEV: BRAN ALEXANDRA


TEMA: GRAFURI NEORIENTATE
CLASA: A XII-A C

PROFESOR COORDONATOR: CIOCAN NATALIA

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.

Exemplu: Fie G = (X, U), a.. X = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, iar


U = {[1, 5], [3, 7], [4, 6], [9, 8], [10, 2], [1, 2], [9, 4], [1, 10], [6, 8]}.
4
1

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:

1, dac exist lan de la i la j


li,j =

0, n caz contrar

Exemplu: Fie G = (X, U), a.. X = {1, 2, 3, 4, 5, 6}, iar


U = {[1, 2], [2, 3], [3, 4], [3, 5], [4, 5], [5, 6]}.

1
6

2
5
3

Lanul 2, 3, 5, 6 este simplu i elementar de lungime 3.


Lanul 5, 3, 4, 5, 6 este simplu, dar nu este elementar de lungime 4.
Lanul 5, 3, 4, 5, 3, 2 este compus i nu este elementar de lungime 5.
Definiii: Un lan pentru care x0 = xn (primul nod coincide cu ultimul) se numete ciclu. Dac
toate vrfurile unui ciclu, cu excepia primului i ultimului, sunt distincte,

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.

II. Tipuri de grafuri


Dac U = atunci graful G = (X, U) se numete graf nul, i reprezentarea lui n plan se reduce
la puncte izolate.
Definiie: Un graf parial al grafului G = (X, U) este un graf G1 = (X, V) a.. V U, adic
G1 are aceeai mulime de vrfuri ca G iar mulimea de muchii V este chiar U sau o
submulime a acesteia.

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

grafuri pariale i anume numrul de submulimi ale

m
mulimii muchiilor {1, 2, , m},

Exemplu: Pentru graful G definit anterior G1 = (X, V), unde


V = {[1, 5], [4, 6], [10, 2]}, este un graf parial.
4
1

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.

Exemplu: Graful definit mai jos este complet i se noteaz cu K5.


2

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.

Exemplu: K3,4 este:


4
1

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.

Exemplu: 1, 2, 3, 9, 8, 7, 5, 6, 4, 1 este ciclu hamiltonian.


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.

Exemplu: 1, 2, 4, 6, 5, 7, 8, 3, 9, 8, 5, 2, 3, 4, 1 este ciclu eulerian.

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.

III. METODE DE REPREZENTARE

1. Matrice de adiacen

O matrice ptratic i simetric de ordin n, cu:


1, pentru [i, j] U
ai,j

0, pentru [i, j] U

Elementele de pe diagonala principal rein 0 i anume: ai,i = 0, i {1, 2, , n}


Suma elementelor de pe linia i i respectiv suma elementelor de pe coloana j au ca rezultat
gradul nodului i respectiv j.
Suma tuturor elementelor matricei de adiacen este suma gradelor tuturor nodurilor , adic
dublul numrului de muchii (2m).

Exemplu: Fie graful G = (X, U), de mai jos:


at
3

2
7
5

6
8

unci matricea lui de adiacen este:

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

2. Liste de adiacen definit dinamic

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

IV. METODE DE PARCURGERE


Parcurgerea n ltime sau pe nivele (BF breath first)

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.

Exemplu: Pentru graful din figura de mai jos:


1
2
4

6
5

3
7

ordinea de vizitare a nodurilor este: 1 3 6 2 7 5 4 sau 1 2 6 3 4 5 7.


Parcurgerea BF se efectueaz prin utilizarea structurii numit coad, avnd grij ca un nod s fie
vizitat o singur dat. Coada va fi alocat static prin utilizarea unui vector. Graful poate fi memorat prin
matrice de adiacen, respectiv liste de adiacen.

Parcurgerea n adncime (DF depth first)

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.

Exemplu: Pentru graful din figura de mai jos:


1

2
4

6
5

3
7

ordinea de vizitare a nodurilor pornind de la nodul 1 este: 1 2 4 5 3 6 7 sau 1 3 7 6 2 5 4.

Parcurgerea DF se efectueaz recursiv graful putnd fi memorat att prin matrice de


adiacen ct i liste de adiacen.

V.Exercitii si problem
Se da un numar n si n valori intregi. Determinati daca cele n valori pot reprezenta

gradele varfurilor unui graf neorientat cu n varfuri.


Exemple:
n=5
1 3 1 2 1 - da
1 5 1 2 1 - nu
1 4 1 2 1 nu
REZOLVARE:
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int bun()
{
int s=0,i,n,x,g;
fin>>n;
for(i=1;i<=n;i++)
{
fin>>g;
if(g<0 || g>=n) return 0;
s=s+g;
}
return !(s%2);
}
int main()
{
if(bun()) fout<<"da";
else fout<<"nu";
fin.close();

fout.close();
return 0;
}

Se citeste un numar natural n nenul. Construiti toate grafurile neorientate cu n


varfuri.
Fiecare graf se va afisa atat ca matrice de adiacenta si prin vectorul muchiilor.
Doua grafuri sunt diferite daca au matricile de adiacenta diferite.
REZOLVARE:
#include<fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
struct muchie
{
int i,j;
};
int x[100000],n,m,nr=0;
muchie M[100000];
void Write()
{ int i,j;
nr++;
fout<<"solutia numarul "<<nr<<"\n";
fout<<"vectorul muchiilor:\n";
for(i=1;i<=m;i++) if(x[i]) fout<<M[i].i<<" "<<M[i].j<<"\n";
fout<<"matricea de adiacenta:\n";
int A[100][100]={0};
for(i=1;i<=m;i++)
if(x[i]) A[M[i].i][M[i].j]=A[M[i].j][M[i].i]=1;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
fout<<A[i][j]<<" ";

fout<<"\n";
}
}

void Sub(int k,int n)


{ for(int i=0;i<=1;i++)
{
x[k]=i;;
if(k==n) Write();
else Sub(k+1,n);
}
}
int main()
{

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;

Se da un graf neorientat cu n varfuri si m muchii citit prin lista muchiilor.


a)

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];

for(i=1;i<=n;i++) if(D[i]==maxx) fout<<i<<" ";


}
int main()
{
citire();
afis();
fin.close();
fout.close();
return 0;
}

Se da un graf neorientat cu n varfuri si m muchii, citit prin vectorul muchiilor.


Sa se afiseze matricea distantelor minime pentru distantele intre oricare 2 varfuri din
graf. Daca nu exista lant intre doua varfuri atunci se va afisa caracterul #.
Se va folosi algoritmul Roy-Floyd.
REZOLVARE:
#include<fstream>
using namespace std;
ifstream fin("g.in");
ofstream fout("g.out");
const int maxx=100000;
int a[100][100],k,n,m,p[100];
void citire()
{
int i,j,x;
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
a[i][j]=a[j][i]=maxx;
for(x=1;x<=m;x++)
{

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.

Sa se afiseze pe linii separate distantele minime de la varful k la celelalte varfuri ale


grafului. Distanta de la un varf la altul se considera a fi numarul de muchii din cel mai
scurt

lant

care

uneste

Se va folosi un algoritm de tip breadth first.


REZOLVARE:
#include<fstream>
using namespace std;
ifstream fin("g.in");
ofstream fout("g.out");
int a[100][100],k,n,m,p[100],d[100],x[100];
void citire()
{
int i,j,x;
fin>>n>>m;
for(x=1;x<=m;x++)
{

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;
}

Se da un graf neorientat cu n varfuri si m muchii. Afisati grupurile de muchii


incidente.
Exemplu
n=5,m=4
muchiile:
[1,2]
[1,3]
[1,4]
[3,4]
grupurile

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");

int A[100][100], D[100][100],n,m;


void citire()
{
fin>>n>>m;

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;
}

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