Sunteți pe pagina 1din 13

Grafuri orientate

Fie o mulţime finită x={x1,x2,......,xn}. Fie Ґ XxX, unde XxX este produsul cartezian
al mulţimii X cu ea însăşi.
Definiţie: Se numeşte graf orientat perechea ordonată G=(X,Ґ)
 Elementele xi € X se numesc noduri sau vârfuri
 Elementele mulţimii Ґ senumesc arce. Un arc (xk, xi) € Ґ se notează cu [xk, xi]
Reprezentare:
x
1

x
3

x
2
x
4
Dacă în graful G=(X, Ґ) [x,y] € Ґ spunem că x şi y sunt adiacente, iar vârfurile x şi y
sunt incidente cu muchia [x,y]. Dacă două arce au în comun un nod atunci arcele se
numesc incidente.
Dacă Ґ=Ø, graful G=(X, Ґ) se numeşte graf nul şi reprezentarea lui în plan se reduce la
puncte izolate.
Graful G se numeşte graf complet dacă oricare ar fi două noduri ale grafului ele sunt
adiacente.
Teoremă: Numărul de grafuri orientate complete care se pot construi cu n noduri
este egal cu nk=
K4 – grafuri complete
1 2 1 2 1 2 cu 4 noduri
4 3 4 3 3 4

Se numeşte succesor al nodului xi orice nod la care ajunge un arc care iese din nodul xi.
Se numeşte predecesor al nodului xi orice nod de la care intră un nod în xi.
Teoremă: Dacă graful orientat G are n noduri atunci numărul total de grafuri
orientate care se pot forma cu aceste noduri este g= 4 n*(n-1) / 2
Definiţie: Un graf parţial al unui graf orientat dat G=(X, Ґ) este un graf G1=(X, Ґ1)
unde Ґ1 Ґ ; un graf parţial se obţine din G prin suprimarea unor muchii din G

x
1

x x
2 3

x
4

1
G=(X, Ґ) G1=(X, Ґ1)

x
1

x x
2 3

x
4
Definiţie: un subgraf al unui graf orientat G=(X, Ґ) este un graf H=(Y, Ґ1), unde Y
X, iar muchiile din Ґ1 sunt toate muchiile din Ґ care au ambele extremităţi în
mulţimea Y; un subgraf al lui G este graful G sau se obţine din G prin suprimarea
anumitor vârfuri şi a tuturor muchiilor adiacente cu acestea.
Teoremă: Numărul de grafuri parţiale ale unui graf cu m muchii (arce) este egal
cu 2 m.
Teoremă: Numărul de subgrafuri ale unui graf cu n noduri este egal cu 2 n -1
G=(X, Ґ) H=(Y, Ґ1)

x x
1 1

x x x
2 3 3

x x
4 4

Gradul unui nod x d(x) este de doua feluri:


 Grad exterior d + (x) care reprezinta numărul arcelor care au ca extremitate iniţială pe
x
 Grad interior d – (x) reprezintă numărul arcelor care au ca extremitate finală pe x
 Se numeşte nod terminal un nod care are suma gradelor egală cu 1
 Se numeşte nod izolat un nod care are suma gradelor egală cu 0

În graful orientat avem


d + (x1)=2d - (x1)=2
x
1
d + (x2)=1d - (x2)=1
d + (x3)=1d - (x3)=0
x x
2 3 d + (x4)=0d - (x4)=1
x
4

Teorema :Dacă graful orientat G are m arce şi n noduri atunci între gradele
nodurilor şi numărul de muchii există următoarea relaţie: suma gradelor interne ale
tuturor nodurilor este egală cu suma gradelor externe ale tuturor nodurilor şi cu
numarul de arce
2
Lanţul este un traseu prin care se parcurg anumite muchii ale grafului. La definirea unui
lanţ nu se ţine cont de orientarea arcelor. Lungimea lanţului reprezintă numărul de
parcurgeri ale muchiilor. Lanţul este egal cu suma muchiilor.
Un lanţ care are toate muchiile distincte două câte două şi extremităţi care coincid se
numeşte ciclu.
Un graf fără cicluri se numeşte graf aciclic.
Dacă toate nodurile ciclurilor sunt distincte două câte două ciclul se numeşte elementar.

1 2 3

4 5 6

Lanţul {1,2,4,5,2,1} nu este ciclu deoarece în lanţ se repetă arcul [1,2]


Lanţul {1,2,5,6,3,2,4,1} este un ciclu neelementar deoarece se repetă nodul cu eticheta 2
Lanţul {1,2,3,6,5,4,1} este un ciclu elementar deoarece nu se repetă niciun nod
Drumul într-un graf orientat poate fi privit ca un lanţ în care parcurgerea de la un nod la
altul trebuie să se facă în sensul arcului care leagă nodurile. Lungimea unui drum este
dată de numărul de arce care îl compun. Drumul de lungime minimă este drumul cu
numărul minim de arce din mulţimea nevidă de drumuri.
Drumul elementar este drumul în care nodurile sunt distincte două câte două. Drumul
simplu este drumul în care arcele sunt distincte două câte două.

Lanţul {1,2,5,6} nu este un drum deoarece parcurgerea


1 2 3
nu se face în sensul săgeţilor
7 Lanţul {1,2,3,6,3,6} este drum neelementar deoarece se
repetă eticheta nodurilor 3 şi 6 şi compus deoarece prin
4 5 6
arcul [3,6] s-a trecut de două ori
Lanţul {1,2,3,7,6} este un drum elementar deoarece nu
se repeta niciun nod
Teorema: Dacă un graf orientat conţine un drum între două noduri x şi y atunci
conţine şi un drum elementar între nodurile x şi y.
Circuitul - Într-un graf orientat un drum care are toate arcele distincte două câte două şi
extremităţile care coincid se numeşte circuit. Circuitul elementar este circuitul în care
toate nodurile sunt distincte două câte două, cu excepţia primului şi ultimului care
coincid.

Lanţul {1,2,3,6,3,6,3,7,6,5,4,1} nu este circuit, deoarece


1 2 3
arcele [3,6] şi [6,3] au fost parcurse de 2 ori
7
3
4 5 6
Lanţul {1,2,3,6,3,7,6,5,4,1} este un circuit neelementar deoarece se repetă eticheta
nodurilor 3 şi 6
Lanţul {1,2,3,7,6,5,4,1} este un circuit elementar deoarece nu se repetă eticheta niciunui
nod.

Un circuit elementar care trece prin toate nodurile grafului se numeşte circuit
hamiltonian

x x
1 4

x x
2 3

Pentru graful din figură avem: [x1,x2], [x2,x3], [x3,x4], [x4,x1] este un circuit
Hamiltonian
Teoremă: Dacă un graf conţine un circuit atunci conţine şi un circuit elementar

Grafuri neorientate
Definiţie: Fie G=(X,Ґ) un graf. Mulţimea Ґ are proprietatea de simetrie dacă şi numai
dacă din [x,y] € Ґ rezultă [y,x] € Ґ

Mulţimea Ґ are proprietatea de simetrie


x
1

x x
2 3

Dacă mulţimea Ґ are proprietatea de simetrie atunci graful G=(X,Ґ) se numeşte graf
neorientat. În cazul grafurilor neorientate nu se desenează ambele arce care unesc două
noduri, se tresează doar una singură care se numeşte muchie, în loc de arc.

Se numeşte graf complet un graf în care oricare două noduri


x
1
sunt adiacente.

x x
2 3

4
x
1
Un graf complet cu 4 noduri se notează K4
x
Teorema: Numărul m de muchii ale unui graf neorientat complet cu n
x
3
2
noduri (Kn) este
x
4

Teoremă: Dacă graful neorientat G are n noduri atunci numărul total de grafuri
neorientate care se pot forma cu aceste noduri este

Gradul unui nod xk al grafului G este egal cu numărul muchiilor incidente cu nodul şi se
notează cu d(xk)
Teoremă: Dacă graful G are m muchii şi n noduri atunci între gradul nodurilor şi
numărul de muchii există următoarea relaţie:

Teoremă: Numărul minim de muchii, m min, pe care trebuie să le aibă un graf


neorientat, cu n noduri, ca să nu existe noduri izolate este:

Subgraful şi graful parţial are aceeaşi semnificaţie şi pt. grafuri neorientate.


Lanţul, ciclul are aceeaşi semnificaţie. Drumul într-un graf neorientat are aceeaşi
semnificaţie cu lanţul.
Fie G=(X,Ґ) un graf . Se numeşte ciclu Hamiltonian un ciclu elementar care trece prin
toate vârfurile grafului. Un graf care admite un ciclu hamiltonian se numeşte graf
hamiltonian.
Definiţie: Un lanţ L al unui graf G=(X,Ґ) care conţine fiecare muchie odată şi numai
odată se numeşte lanţ eulerian. Daca primul nod al uni lanţ eulerian egal cu ultimul nod
atunci ciclul respectiv se numeşte eulerian. Un graf care conţine un ciclu eulerian se
numeşte eulerian. Prin faptul că un graf este eulerian nu înseamnă ca nu are noduri
izolate.

Graful alăturat este hamiltonian. Un drum


2 hamiltonian este
9 {1,2,3,9,8,7,5,6,4,1}
1 3

4 5
6 7
5
Graful alăturat este eulerian. Un ciclu eulerian
2 este:
9
1 3 {1,2,4,6,5,7,8,3,9,8,5,2,3,4,1}
8 Teorema: Un graf G=(X,Ґ), fără vârfuri
4 5 izolate este eulerian dacă şi numai dacă este
conex şi gradele tuturor vârfurilor sale sunt
6 7
numere pare.

Definiții:

 Într-un graf neorientat, se numește lanț eulerian un lanț simplu în care apare fiecare muchie
(fiind lanț simplu, fiecare muchie apare o singură dată).
 Într-un graf neorientat, se numește ciclu eulerian un ciclu în care apare fiecare muchie.
 Un graf neorientat se numește graf eulerian dacă conține un ciclu eulerian.

Exemplu:

În graful de mai sus ciclul (1 2 4 5 3 6 5 2 3 1) este eulerian.

Teoremă:

Un graf neorientat fără vârfuri izolate este eulerian dacă și numai dacă este conex și toate vârfurile au
grad par.
Un graf neorientat fără vârfuri izolate conține un lanț eulerian, dacă și numai dacă este conex și toate
vârfurile au grad par, mai puțin două. Aceste vârfuri vor fi extremitățile lanțului eulerian.

6
Un graf G se numeşte conex dacă are proprietatea că pentru orice pereche de noduri
diferite între ele, există un lanţ care să le lege.

1 2 3 4 Graful alăturat este un graf conex, deoarece oricare


ar fi două noduri din mulţimea X ele pot fi legate
printr-un lanţ. Ex (1,2) → {1,2} sau {1,5,2};
(1,3) → {1,2,3} sau {1,6,3}
5 6 7 8

1 2 3 Graful orientat este un graf conex, deoarece oricare ar fi


două noduri din mulţimea X, ele pot fi legate printr-un lanţ.
7 Ex: (1,2) → {1,2} sau {1,4,2} sau (1,3) → {1,2,3} sau
{1,2,5,6,3}
4 5 6

Graful nu este conex, deoarece nu există niciun lanţ între


6 un nod din mulţimea C1={1,2,3,4} şi un nod din
1 2
mulţimea C2={5,6,7} sau din mulţimea C3={8}
5
Dacă un graf G=(X,Ґ) nu este conex, se poate defini un
4 3 7
subgraf conex al grafului G.
8
Dacă un graf G=(X,Ґ) nu este conex, se numeşte
componentă conexă a grafului un subgraf conex al său ( care conţine numărul maxim de
noduri din G care au proprietatea că sunt legate cu un lanţ)

Un graf conex are o singură componentă conexă

6 În exemplul alăturat sunt 3 componente conexe


1 2
Teoremă : Numărul minim de muchii m min necesare
5 pentru ca un graf neorientat cu n noduri, să fie conex este
n-1
4 3 7
8

7
Propoziţie: Dacă un graf cu n noduri are p componente conexe, atunci numărul minim de
muchii care trebuie adăugate, ca să devină conex, este p-1
Propoziţie: Dacă un graf conex cu n noduri are n-1 muchii, atunci orice pereche de
noduri este legată printr-un lanţ şi numai unul.
Propoziţie: Dacă un graf neorientat cu n noduri şi m muchii este conex, numărul maxim
de muchii care se pot elimina pentru a obţine un graf parţial conex este m-n+1
Teoremă: Un graf neorientat conex, cu n nodurişi n-1 muchii, este aciclic şi maximal în
raport cu această proprietate. Dacă unim două noduri neadiacente oarecare graful va
conţine un ciclu.
Teoremă: Dacă un graf neorientat conex are n noduri şi m muchii, numărul de muchii
care trebuie eliminate pentru a obţine un graf parţial conex aciclic, este egal cu m-n+1
Propoziţie: Dacă un graf are n noduri, m muchii şi p componente conexe, numărul de
muchii care trebuie eliminate pentru a obţine un graf parţial aciclic este egal cu m-n+p
Propoziţie: Pentru a obţine dintr-un graf neorientat conex, două componente conexe,
numărul minim de muchii care trebuie înlăturate m min este egal cu gradul minim din graf :
m min=grad min
Un graf este tare conex dacă are proprietatea că pentru orice pereche de noduri diferite
între ele, există un drum (la grafuri orientate drumul ţine cont de orientarea arcelor) care
să le lege.

Graful din figură este un graf tare conex, deoarece există


1 2 3 un circuit elementar care trece prin toate nodurile grafului :
{1,2,3,7,6,5,4,1}, altfel spus oricare ar fi două noduri din
7 mulţimea X, ele pot fi legate printr-un drum.
4 5 6

Graful din figură nu este conex deoarece nu există niciun


6 drum între un nod din mulţimea C2={5,6,7} şi un nod din
1 2 mulţimea C1={1,2,3,4} sau din mulţimea C3={8}
5 Dacă un graf orientat nu este tare conex, se poate defini
un subgraf tare conex al grafului G.
4 3 7 Dacă un graf G nu este conex se numeşte componentă
8
tare conexă a grafului un subgraf conex C al său,
maximal în raport cu această proprietate (conţine numărul
maxim de noduri din G care au proprietatea că sunt legate printr-un drum).
Subgraful tare conex C este o componentă tare conexă a grafului dacă are proprietatea că
nu există niciun drum al grafului G care să unească un nod xi al subgrafului C cu un nod
xj care nu aparţine subgrafului C
În graful de mai sus fiecare din cele 3 mulţimi de noduri C1, C2, C3 induce câte o
componentă tare conexă.
Obs: Un graf tare conex are o singură componentă tare conexă (graful însuşi)

8
Determinarea componentelor tare conexe:
Subgraful predecesorilor unui nod este format din acel nod şi mulţimea nodurilor din
care este accesibil nodul.
Subgraful succesorilor unui nod este format din acel nod şi din mulţimea nodurilor care
sunt accesibile din el.
Componenta tare conexă din care face parte un nod este dată de intersecţia dintre
subgraful predecesorilor şi subgraful succesorilor unui nod.
Ex: Pt. Graful din figura de mai jos

2 Pas1: Se identifică subgraful succesorilor primului nod:


S1={1,2,3,4,5}
1 Pas2: Se identifică subgraful predecesorilor nodului 1:
3 6
P1={1,2,3}
Pas3: Se determină componenta tare conexă prin intersecşia celor
4 5
două mulţimi: C1=S1∩P1={1,2,3}
Pas4: Se identifică primul nod care nu face parte din componenta
tare conexă şi se reiau paşii.
Primul nod care nu face parte din componenta tare conexă este nodul 4. S2={4,5},
P2={1,2,3,4,5} C2=S2∩P2={4,5}
Componenta a treia este {6}
Parcurgerea grafului reprezintă operaţia prin care sunt examinate nodurile grafului
pornind de la un nod dat, i, astfel incât fiecare nod accesibil din nodul i pe muchiile
(arcele) adiacente să fie atins o singură dată.
1.Metoda de parcurgere în laţime (Bread First BF): Se vizitează mai întâi un nod iniţial
i, apoi vecinii acestuia, apoi vecinii nevizitaţi ai acestora, ş.a.m.d. până când se parcurg
toate nodurile grafului.
2.Metoda de parcurgere în adâncime (Depth First DF) Se vizitează mai întâi un nod
iniţial i, după care se parcurge primul dintre vecinii săi nevizitaţi, de exemplu j, după care
se trece la primul vecin nevizitat al lui j ş.a.m.d până când se parcurge în adâncime
ramura respectivă. Când s-a ajuns la capătul ei, se revine la nodul din care s-a plecat
ultima dată, şi se parcurge următorul său vecin nevizitat.

1 1.În cazul metodei de parcurgere în lăţime BF, vor fi parcurse


pe rând nodurile: {1,2,3,4,5,6,7,8,9}
2 3 4
2.În cazul metodei de parcurgere în adâncime, DF vor fi
parcurse pe rând nodurile: {1,2,5,3,6,8,9,7,4}
5 6 7

8 9

9
Reprezentarea grafurilor
1.Reprezentarea prin matricea de adiacenţă Matricea de adiacenţă a unui graf este o
matrice pătratică de ordinul n ale cărei elemente a ij sunt definte astfel:

1, dacă [i,j] U
ai,j=
0, dacă [i,j] U

1 2 7
1 2 3
5 6

4 3 8 4 5 6

Graf1 Graf2

Proprietăţile matricei de adiacenţă: Elementele de pe diagonala principală au


valoarea 0 din definiţia grafului (orice muchie (arc) ij trebuie să respecte condiţia i j )
În cazul unui graf neorientat matricea de adiacenţă este o matrice simetrică față de
diagonala principală, deoarece dacă există muchia [i,j] atunci există şi muchia [j,i]
Pt. graful neorientat gradul unui nod i este egal cu suma elementelor de pe linia i sau cu
suma elementelor de pe coloana i
Pt. Graful orientat: gradul extern al nodului i este egal cu suma elementelor de pe linia i,
gradul intern al nodului i este egal cu suma elementelor din coloana i
Reprezentarea prin lista de adiacenţă: Un graf orientat cu n noduri poate fi memorat
prin utilizarea unor liste de adiacenţă. Pentru fiecare nod i, o listă liniară simplu
înlănţuită va reţine toate nodurile j pentru care [i,j] Ґ lista succesorilor

10
3
1 4 2
2
2 1
1
4
3 4 2

Arborele
Se numeşte arbore A un graf neorientat şi conex şi fără cicluri
Teorema: Următoarele definiţii sunt eechivalente pentru un graf G cu n noduri şi
m muchii:
1)G este un arbore
2)G este un graf aciclic cu n-1 muchii
3)G este un graf conex cu n-1 muchii
4)G este un graf fără cicluri maximal (dacă în graful fără cicluri G unim două
noduri oarecare neadiacente printr-o muchie, graful obţinut conţine un ciclu)
5)G este graf conex minimal (dacă în graful conex G suprimam o muchie oarecare,
graful obţinut nu mai este conex)
6)Orice pereche de noduri este legată printr-un lanţ şi numai unul
Propoziţie: Orice arbore cu n noduri are n-1 muchii
Propoziţie: Orice arbore cu n≥2 noduri conţine cel puţin două noduri terminale

Parcurgerea unui arbore


O formă de reprezentare a arborilor este legătura de tip TATA. Arborele se reprezintă
sub forma unui vector t cu n componente: daca t[i]=k atunci nodul i este descendent al
nodului k. Dacă nodul i este vârf t[i]=0

1 2 3 4 5 6 7 8 9
3 1 4
T 5 3 5 5 0 3 4 1 7

2 6 8 7 9

11
Şiruri de caractere

*)Codul ASCII al literelor: A – 65; a – 97


for(i=0; i<26; i++){
65+i – litera mare corespunzatoare poziţiei “i” de după A
97+i – litera mica corespunzatoare poziţiei “i” de după a
*) Vectorul de frecvenţă a literelor într-un text
for(i=0;i<26;i++)
v[i]=0;
for(i=0; i<strlen(text); i++)
v[c-65]=v[c-65]+1 – de câte ori apare litera c într-un text, de atâtea ori creşte valoarea
vectorului de indice c-65
*)funcţii :
-lungimea şirului sir – strlen(sir)
-citirea cu spaţii albe – cin.get(sir, nr, ch)
cin.get()
-copierea şirurilor – strcpy(s2,s1) – se copiază din s1 în s2 toate caracterele inclusiv
NULL
strncpy(s2,s1,n) – se copiază din s1 în s2 maxim n caractere
-concatenarea strcat(s2,s1) – se adaugă din s1 la sfarsitul lui s2 toate caracterele
strncat(s2,s1,n) – se adaugă din s1 la sfarşitul lui s2 maxim n
caractere
-compararea srcmp(s2,s1) – compară cele doua şiruri: dacă sunt identice se
intoarece 0; daca s1>s2 se întoarce un nr. pozitiv; dacă s1<s2 se întoarce un nr. negativ
-tolower(ch) – transformă caracterul ch din literă mare în literă mică
-toupper(ch)_ - transformă caracterul ch din literă mică în literă mare <ctype.h>
-strlwr(sir) – în şirul de caractere sir transformă literele mari în litere mici, restul
caracterelor rămân neschimbate
-strupr(sir) - în şirul de caractere sir transformă literele mici în litere mari, restul
caracterelor ramân neschimbate
-strchr(sir,ch) – furnizează un pointer către prima apariţie a caracterului ch în şirul de
caractere sir.
*) căutarea vocalelor şi a consoanelor :
char s[100],vocale[]= ”aeiou ”;
for(i=0;i<strlen(s);i++)
if(strchr(vocale,s[i])!=NULL sau = =NULL)
…….
-strstr(sir,sb) – se caută subşirul sb în şirul sir. Dacă se gaseşte se întoarce pointer către
prima apariţie a subşirului, altfel se întoarce NULL.
-strtok(s1,s2) – s2 este un şir de caractere care pot fi folosite ca delimitatori, iar s1 este
format din mai multe entităţi separate printr-unul (sau mai mulţi) dintre delimitatorii din
12
s2. Funcţia înlocuieşte separatorii prin NULL şi întoarce un pointer către primul caracter
al primei entităţi. Pt. a găsi următoarea entitate funcţia se apelează strtok(NULL,s2)
Majoritatea funcţiilor ţin de <string.h>, <stdlib.h> şi <conio.h>
-f.getline(sir,nr) – copiaza in sirul sir din f pana la sfarsitul randului sau maxim nr
caractere

Matrici (pătratice)

-elementele de pe diagonala principală: i==j


-elementele de pe diagonala secundară :
daca elementele sunt notate de la 0 : i+j= =n-1
daca elemetele sunt notate de la 1 : i+j= =n+1
-elementele matricei situate sub diagonala principală
for(i=1 ;i<=n ;i++)
for(j=1 ;j<i ;j++)
cout<<a[i][j];
- elemntele matricei situate deasupra diagonalei principale
for(i=1 ;i<=n ;i++)
for(j=i+1 ;j<=n ;j++)
cout<<a[i][j];
- elemntele matricei situate deasupra diagonalei secundare
for(i=1 ;i<=n ;i++)
for(j=1 ;j<n+1-i ;j++)
cout<<a[i][j];
- elemntele matricei situate dedesubtul diagonalei secundare
for(i=1 ;i<=n ;i++)
for(j=n+2-i ;j<=n ;j++)
cout<<a[i][j];

Fişiere
#include<fstream.h>
citirea din fişier:
fstream f(“C:\\fis1.txt”, ios::in); sau ifstream f(“C:\\fis1.txt”);
f>>n;
scrierea în fişier:
fstream g(“C:\\fis.txt”,ios::out); sau ofstream g(“C:\\fis.txt”);
g<<n;
închiderea:
f.close();
g.close();

13

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