Sunteți pe pagina 1din 10

GRAFURI

1. Grafuri neorientate

Definiţie: Un graf neorientat este o pereche ordonată de mulţimi, notat G - (X,U), X diferită de
mulţimea vidă, este o mulţime finită -> mulţimea nodurilor (vârfurilor), U mulţimea muchiilor.
U={[x,y]| x,y aparţin X}

Definiţie: [x,y] se numesc muchie a grafului, x şi y sunt vârfuri adiacente, muchia este
incidenta vârfurilor.

Convenţie:
n = numărul nodurilor |X|=n
m = numărul muchilor |U|=m
X={x1,x2, … xn}  X={1,2,3, .. n}

2 6

1
4 5 7

3 8

1 1
9 0 1
0 0

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

Definiţie: Graf parţial pentru graful G=(X,U), este un graf G1=(X,v), V inclusă în U
Ex.
G1: V={[1,2], [1,3], [1,4], [2,4], [3,4], [4,5], [5,6], [5,7], [5,8]}
G1: V= mulţime vid ă
G1: V=U
Definiţie: Subgraf pentru graful G=(X,U), un graf H=(Y,W) unde Y este inclus în X iar W este
mulţimea muchiilor induse de vârfurile din Y (W inclus în U)

Ex:
H=(Y,W)
Y={1,2,3,4,7}
W={[1,2], [1,3], [1,4], [2,4], [3,4]}
Y={2,4,5,9}
W={[2,4], [4,5]}
Temă: Fie graful G=(X,U), unde X={1,2,3,4} iar U={[1,2], [1,3], [1,4]} Câte grafuri parţiale
se pot construi?

Răspuns: 8 grafuri parţiale;


- se pot elimina: câte o muchie => 3 grafuri parţiale; câte 2 muchii -> 3 grafuri parţiale; câte 3
muchii -> 1 graf parţial + 1 graful iniţial
- C31 + C32 + C30 + C33

Definiţie: Un graf complet este un graf neorientat în care oricare două vârfuri sunt adiacente.

Oricare x,y din X rezultă există [x,y] aparţine lui U


|X| = n graful complet se notează Kn
Nr. de muchii: m=n*n(n-1)/2

Temă: Câte grafuri neorientate cu n noduri se pot construi?

A = mulţimea muchilor care se pot forma cu n noduri.


Mulţimea are n*(n-1)/2 valori, valorile fiind muchii\

Construiesc funcţie
F: A → {0,1}
F(muchie)= 0 => muchia nu a fost aleasă
F(muchie)= 1 => muchia a fost aleasă
Numărul grafurilor neorientate este egal cu numărul funcţiilor F
F -> 2n*(n-1)/2
N=4 câte grafuri neorientate: 6 muchii în graful complet cu 4 vârfuri -> 26 = 64 grafuri

Definiţie: Graf bipartit G=(X,U) este graful care îndeplineşte condiţiile:


- există o partiţie a mulţimii nodurilor formată din 2 submulţimi: există A şi B astfel încât
AUB=X, A intersectat cu B = mulţime vidă, unde A, B – diferite de mulţime vidă
- orice muchie se formează cu un nod în prima partiţie şi celălalt în a doua partiţie.

1
4
2
5
3

Ex. X={1,2,3,4,5} iar U={ [1,4], [2,4], [3,5] }


partiţii pentru X: A={1,2,3}
B={4,5}
A={1,2,5}
B={4,3}

Definiţie: Graf bipartit complet


- există o partiţie a mulţimii nodurilor formată din 2 submulţimi: există A şi B astfel încât
AUB=X, A intersectat cu B = mulţime vidă, unde A, B – diferite de mulţime vidă
- orice vârf din prima partiţie şi este adiacent cu toate vârfurile din a doua partiţie.
1
2
3
4
5

|A| = p noduri
|B| = q noduri
Graful bipartit complet se notează Kpq
-nr. de muchii m=p*q

Definiţie : Graful neorientat G=(X,U), Gradul vârfului = numărul muchiilor incidente vârfului
respectiv

2 6

1
4 5 7

3 8

1 1
9 0 1
0 0

d[x]={k|k = numărul muchilor incidente vârfului x}


d[1]=2
d[4]=3
d[5]=4
d[7]=1
d[11]=0

Observaţii
1. d[x]=1 => vârful x este vârf terminal
2. d[x]=0 => vârful x este izolat
3. Σ d[x] = număr par = 2*m – fiecare muchie [x,y] aduce +1 pentru vârful x şi +1 pentru vârful
4. d[x]<n pentru că d[x]=n-1 maximul gradelor într-un graf cu n noduri
5. Graf complet d[x]=n-1 oricare ar fi vârful x, pentru că x este unit cu toate n-1 vârfuri
6. Suma gradelor impare este un număr par.

Exerciţiu:
Secvenţa {5, 3, 0, 3, 1, 4 } poate fi secvenţa gradelor vârfurilor unui graf? NU d[1]=5 (unit cu toate
vârfurile), d[3]=0  fără legături
Definiţie: Graf neorientat G=(X,U), lanţ ca fiind o succesiune L={x1,x2, ... xk} de vârfuri în care
orice două vârfuri de pe poziţii consecutive sunt legate printr-o muchie.

Ex.
L1=[1, 2, 4, 5, 8] => lanţ, are vârfuri distincte două câte două
L2=[1, 2, 3, 4, 5] => nu este lanţ [2,3] nu este muchie
L3=[5, 4, 3, 1, 2, 4] => lanţ, are vârfuri care se repetă, dar foloseşte muchii distincte
L4=[1, 2, 1, 3, 4] => lanţ, are vârfuri care se repetă şi foloseşte muchia [1,2] de mai multe ori

Observaţii

- lanţul cu vârfuri distincte -> lanţ elementar


- lanţul în cae există vârfuri se repetă se numeşte lanţ neelementar
- numărul de muchii care formează lanţul = lungimea lanţului

Definiţie : Graf neorientat G=(U,X), ciclu, o secvenţă de noduri C=[x1, x2, ... xk, x1] în care
primul şi ultimul nod sunt identice. Un ciclu foloseşte muchii distincte.

2 6

1
4 5 7

3 8

9 10 11

C1=[1, 2, 3, 1] => ciclu, în afară de primul şi ultimul, celelalte vârfuti sunt distincte
C2=[4, 5, 6, 7, 5] => nu este ciclu
C3=[2, 3, 1, 2] => ciclu C1=C3
C4=[4, 2, 1, 3, 4] => ciclu
C5=[5, 4, 3, 5, 6, 7, 5] => ciclu, există vârfuri care se repetă în afară de primul şi ultimul

Observaţii
- ciclu elementar: în afară de primul şi ultimul, celelalte vârfuri sunt distincte
- ciclu neelementar : există vârfuri care se repetă în afară de primul şi ultimul
- cicluri egale : subgrafurile generate de vârfurile ciclului sunt identice
- numărul de muchii = lungimea ciclului

Definiţie: G=(X,U) graf neorientat, G este conex  între orice două vârfuri există un lanţ
Definiţie: G=(X,U) nu este conex, atunci este alcătuit din componente conexe, componenta conexă
fiind un subgraf maximal în raport cu proprietatea de conexitate.

Exemplu:
- figură: 3 componente conexe: {1, 2, 3, 4, 5, 6, 7, 8}, {9, 10}, {11}
- vârful izolat este o componentă conexă a grafului
Exerciţiu

1. Graf neorientat cu n=15 noduri şi m=12 muchii. Care este numărul maxim de componente
conexe pe care le poate avea?

9 vârfuri izolate (7, 8, 9, ... 15) + 1 element conex (1, 2, 3, ... 6) =10 elemente conexe
(Maxim)

Definiţie: G=(X,U) graf neorientat este graf hamiltonian  există un ciclu hamiltonian în graf,
ciclu elementar care trece prin toate nodurule.

Definiţie: G=(X,U) graf neorientat este graf eulerian  un ciclu eulerian, un ciclu eulerian este un
ciclu care cuprinde toate muchiile.

REPREZENTAREA GRAFURILOR ÎN MEMORIE

Graful neorientat G=(X,U)


1. Matricea de adiacenţă
a[x][y] = 1 dacă [x,y] aparţine lui U (este muchie, x, y sunt adiacente)
0 caz contrar

011011
100011
100101
001010
110101
111010

Observaţii :
- matrice pătratică cu n linii şi n coloane
- matrice simetrică faţă de diagonala principală a[i][j]=a[j][i]
- suma valorilor de 1 de pe linia i (sau a valorilor 1 de pe coloana i) => gradul vârfului i
- descrierea muchiilor grafului
for(i=1; i<n; i++)
for(j=i+1; j<=n; j++)
if(a[i][j]==1) cout<<”[“<<i<<”,”<<j<<”]”;
- a[i][i]=0 => graful nu are bucle

Exemplu
Matricea de adiacenţă oebtru un graf complet cu 5 noduri

01111
10111
11011
11101
11110

Avantaj: este uşor de folosit


Dezavantaj: memorie multă, nu pot reprezenta grafuri cu multe noduri (n=1000...)
2. Liste de adiacenţă

L[i] = { k | k este adiacent vârfului i}


L[1] : 2, 3, 5, 6
L[2] : 1, 5, 6
L[3] : 1, 4, 6
L[4] : 3, 5
L[5] : 1. 2. 4, 6
L[6] : 1, 2, 3, 5

Observaţii:
- numărul de noduri din lista vârfului reprezintă gradul vârfului
- reprezentare statică, matrice cu număr variat de coloane
- reprezentare dinamică
typedef struct nod
{ int v;
struct nod *adr;
}*pNod;

pNod L[Max]; // Max=nr. max de noduri

o citirea muchiei [x,y]


// introducerea vârfului x în lista lui y
q=new nod;
q->v=x;
q->adr=L[y];
L[y]=q; // L[y]=stivă

// introducerea vârfului y în lista lui x


q=new nod;
q->v=y;
q->adr=L[x];
L[x]=q; // L[x]=stivă

3. Vector de muchii

typedef struct
{
int x,y ;
} Muchie;

Muchie v[Max] ; // max = numărul maxim de muchii m=n*(n-1)/2


for(i=1 ; i<=m ; i++)
cin>>v[i].x>>v[i].y ; // in>>

Probleme
1. G=(X,U), n=nr de noduri, m=nr de muchii
m>(n-1)*(n-2)/2
 G nu are varfuri izolate
Solutie
- prin reducere la absurd
Presupunem ca exista X varf izolat => celelalte n-1 noduri formeaza graf complet
 m=(n-1)(n-2)/2 Contradictie!!!
 G nu are bvarfuri izolate

2. Oricare ar fi G=(X,U) cu n>=2 varfuri, contine cel putin doua varfuri cu acelasi grad
Presupunem prin reducere la absurd:
Oricare doua varfuri au grade diferite
 n noduri
 n valori distincte, cea mai mare n-1
 sirul 0, 1, 2, ... n-1 = sirul gradelor
 exista 1 varf izolat si un varf legat de toate: Contradictie!
 Exista cel putin 2 varfuri cu acelasi grad!

PARCURGEREA GRAFURILOR

- Examinarea nodurilor pornind dintr-un anumit nod

1. Parcurgerea în lăţime (Breadth First)

6 1

5
2

4 3

- graful din imagine


- vp=1:
- 1 2 3 6 4 5
P u u u
P p
p p p p=> terminat de prelucrat vârfurile
- vp=2
2 1 3 6 4 5

-vp=5
5 4 3 1 6 2

Observaţii :
- se foloseşte pentru prelucrare o coadă: p,u (First In, First, Out)
- p=1, u=0 => coadă vidă (u-p+1=0)
- parcurgerea se realizează while(p<=u)
2. Parcurgerea în adâncime (Depth First – DF)

6 1

5
2

4 3

foloseşte stivă

5
4 4 6
2 3 3 3 3
1 1 1 1 1 1 1

1, 2, 3, 4, 5, 6

GRAFURI HAMILOTNIENE

Definiţie: G=(X,U) graf neorientat este graf hamiltonian  există un ciclu hamiltonian în graf,
ciclu elementar care trece prin toate nodurule.
Teoremă: pentru G=(X,U) graf neorientat, cu n noduri (n>=3) dacă oricare ar fi x d[x]>=n/2 atunci
graful conţine un ciclu hamiltonian.
Reciproca: Dacă graful conţine un ciclu hamiltonian, nu este neapărat ca d[x]>=n/2

2
5

3
4

Este un graf hamiltonian dar d[x]=2


GRAFURI EULERIENE

Definiţie: G=(X,U) graf neorientat este graf eulerian  un ciclu eulerian, un ciclu eulerian este un
ciclu care cuprinde toate muchiile.

Teoremă:
G=(X,U) nu are vârfuri izolate
G eulerian  conex şi d[x] număr par oricare ar fi x vârf din X

2 3
1

12 4
10

11
5
1
3
9 6
7
8

D[]={2,2,4,2,2,2,2,2,2,6,2,2,2}
C[]={1,10,2,3,4,5,6,3,7,8,10,9,13,11,10,12,1}
C[]={v1,v2,…vk}
-şterg muchiile folosite
-reactualizez vectorul gradelor
-caut în C un vârf cu gradul diferit de zero
-din vârful respectiv => C[1]={vi,x1,x2,…,xj,vi}
-se inserează ciclul C1 în ciclul C

Se considera un graf conex. Sa se determine un subgraf conex cu k noduri.

MATRICEA PONDERILOR

- fiecărei muchii i se asociază un cost, valoare


- a[i][j] = cost dacă [i,j] este muchie, cost = costul ataşat muchiei
0 rest
ARBORI

Definiţie: Un graf conex şi fără cicluri = Arbore.


Proprietăţi:
1. Teoremă de caracterizare: afirmaţiile următoare sunt echivalente:
a. G = arbore
b. G = conex minimal, dacă se elimină o muchie se pierde conexitatea
c. G fără cicluri maximale, daă se adaugă o muchie => un ciclu
2. G arbore cu n noduri => are n-1 muchii
3. Teoremă, afirmaţiile următoare sunt echivalente:
a. G arbore
b. G conex cu n-1 muchii
c. G fără cicluri, cu n-1 muchii
4. Într-un arbore există cel puţin două vârfuri terminale

Modalităţi de reprezetare :
- modalităţi de reprezentare a grafurilor.
- Vector de taţi, T[i]=tatăl nodului i, T[răd]=0 ;

Exemplu :
T={3, 4, 0, 3, 3, 5}

1 4 5

2 6

- primul nivel = rădăcina


- al doilea nivel : nodurile adiacente rădăcinii
- al treilea nivel noudirle adiacente nodurilir de pe nivelul II
- etc
- fraţi: descendeţii aceluiaşi tată
- nodurile fără descendenţi se numesc frunze

Problemă: Se consideră un şir de valori naturale. Să se verifice dacă există un arbore, cu n voduri
pentru care gradele vârfurilor să fie numerele date.