CAPITOLUL 9- Teoria grafurilor A) GRAFURI NEORIENTATE 9.1) NOŢIUNI INTRODUCTIVE: Definiţie: Graful neorientat este o pereche ordonată G=(V, E). unde: • V= { v1, v2,…,vn} este o mulţime finită şi nevidă. Elementele mulţimii V se numesc noduri (vârfuri); • E este o mulţime finită de perechi neordonate de forma (vi, vj), unde i diferit de j, si vi, vj ∈ V. Elementele mulţimii se numesc muchii. Semnificaţia unei muchii este aceea că uneşte două noduri. •
exemplu de graf neorientat: 1
2 3
6
5
4
Avem: G=(V,E) V= {1,2,3,4,5,6} E= { (1,2), (1,3), (1,5),(2,3), (3,4),(4,5)} Observaţii: Se notează cu n numarul de nodurin=6, iar cu m numărul muchiilor m=6 Muchia (1,2) este aceeaşi cu (2,1) pentru ca avem un graf neorientat. Nu există o muchie care uneşte un nod cu el insuşi. Două noduri pot fi unite prin cel mult o muchie.
Definiţii: 1. În graful g=(V,E), nodurile distincte vi ,vj ∈ G sunt adiacente dacă există muchia (vi ,vj ) ∈ E. Vom spune că muchia (vi ,vj ) ∈ E este incidentă la nodurile vi şi vj . În exemplul nostru nodurile 1 şi 5 sunt adiacente dar nodurile 2 şi 5 nu sunt adiacente. Muchia (4,5) este incidentă la nodurile 4 şi 5. 2. Într-un graf neorientat, prin gradul unui nod v se înţelege numărul muchiilor incidente cu nodul v şi se notează cu d(v). Un nod cu gradul 0 se numeşte nod izolat, iar unul cu gradul 1 se numeşte nod terminal. Exemplul nostru : d(2)=2, d(1)=3, d(6)=0 (nod izolat). 3. O relaţie utilă: d1+d2+,....,+ dn =2*m, adică suma gradelor nodurilor grafului = 2* numărul muchiilor; 9.2) MEMORAREA GRAFURILOR Memorarea se face prin mai multe metode care e aleg în funcţie de : • algoritmul care prelucrează datele referitoare la graf; • memoria internă pe care programul o are la dispoziţie; • dacă graful conţine multe muchii sau nu. 1
Structuri de memorare a grafurilor: 1. Memorare grafului prin matricea de adiacenţă a. Este o matrice An,n – o matrice pătratică, unde elementele ei, ai,j au semnificaţia: 1, pentru (i,j) ∈ E i. Ai,j = 1. 0, pentru (i,j) ∉ E Pentru exemplul de graf dat, matricea de adiacenţă este:
A6,6=
011010 101000 110100 001010 100100 000000
Observaţii: Elementele de pe diagonala principală sunt 0 ( pentru că am definit un graf la care nu există muchii de la un nod la el insuşi) Matricea de adiacenţă este simetrică ai,j = aj,i ∀ i,j ∈ { 1,2,..,n} Suma elementelor de pe linia i reprezintă gradul nodului i, adică d(i) Suma tuturor elementelor matricei de adiacenţă = suma gradelor tuturor nodurilor, adică dublul numărului de muchii (2m) b) Crearea matricei prin citirea muchiilor grafului: Datele se citesc dintr-un fişier care are pe primul rând numărul de noduri, iar pe fiecare din următoarele câte o muchie. Se foloseşte funcţia următoare: Fişierul ptr graful nostru: void CitireN (char nume_fiş[20], int a[50][ 50], int &n) { 6 int i,j; 12 fstream f(nume_fiş,ios :: in); 13 f>>n; 15 while (f>>i>>j) 23 a[i][j]=a[j][i]=1; 34 f.close(); 45 } Programul următor citeşte muchiile grafului şi afişează matricea de adiacenţă. # include # include int a[50][50], n; void CitireN (char nume_fiş[20], int a[50][ 50], int &n) { int i,j; fstream f(nume_fiş,ios :: in); f>>n; while (f>>i>>j) a[i][j]=a[j][i]=1; f.close(); } 2
void main( ) { CitireN (“graf.txt”,a,n); For (int i=1; i<=n;i++) { for (int j=1; j<=n;j++) cout<
1 2,3,5