Teoria Grafurilor: Grafuri Orientate – Noțiuni Introdutive 22
1. Obiectivele lecției:
- Să înțeleagă conceptul de graf orientat și elementele sale fundamentale.
- Să învețe despre proprietățile și reprezentările grafurilor orientate.
- Să exploreze diferențele dintre grafurile orientate și cele neorientate.
2. Ce este un graf orientat?
Un graf orientat (sau digraf) este o structură matematică formată din:
- Noduri (vârfuri): Entitățile distincte ale grafului (VVV).
- Arce (muchii orientate): Legături direcționate între noduri (EEE).
Proprietăți:
- Arcele sunt direcționate: Fiecare muchie (u,v)(u, v)(u,v) are un sens de la uuu la vvv.
- Gradul unui nod:
- Grad intrare (in-degree): Numărul de arce care intră în nodul vvv.
- Grad ieșire (out-degree): Numărul de arce care ies din nodul vvv.
- Drumuri orientate: Succesiuni de arce respectă direcția indicată.
3. Exemple de grafuri orientate
- Graf simplu:
(1) → (2)
↑ ↓
(4) ← (3)
- Arcele: {(1,2),(3,4),(4,1),(2,3)}\{(1, 2), (3, 4), (4, 1), (2, 3)\}{(1,2),(3,4),(4,1),(2,3)}
- Grad intrare și ieșire:
- degin(1)=1,degout(1)=1deg_{in}(1) = 1, deg_{out}(1) = 1degin(1)=1,degout(1)=1
- degin(2)=1,degout(2)=1deg_{in}(2) = 1, deg_{out}(2) = 1degin(2)=1,degout(2)=1
- degin(3)=1,degout(3)=1deg_{in}(3) = 1, deg_{out}(3) = 1degin(3)=1,degout(3)=1
- degin(4)=1,degout(4)=1deg_{in}(4) = 1, deg_{out}(4) = 1degin(4)=1,degout(4)=1
4. Reprezentări ale grafurilor orientate
1. Matricea de adiacență
- Definiție:
O matrice AAA de dimensiune ∣V∣×∣V∣|V| \times |V|∣V∣×∣V∣, unde:- A[i][j]=1A[i][j] = 1A[i][j]=1 dacă există un arc de la nodul iii la nodul jjj.
- A[i][j]=0A[i][j] = 0A[i][j]=0 altfel.
- Exemplu:
Graful:
(1) → (2)
↑ ↓
(4) ← (3)
Matricea de adiacență:
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
- Implementare în C++:
#include <iostream>
using namespace std;
void afisareMatrice(int n, int matrice[100][100]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << matrice[i][j] << ” „;
}
cout << endl;
}
}
int main() {
int n = 4; // Numărul de noduri
int matrice[100][100] = {0};
// Adăugare arce
matrice[0][1] = 1; // Arc 1 → 2
matrice[1][2] = 1; // Arc 2 → 3
matrice[2][3] = 1; // Arc 3 → 4
matrice[3][0] = 1; // Arc 4 → 1
cout << „Matricea de adiacență:\n”;
afisareMatrice(n, matrice);
return 0;
}
2. Lista de adiacență
- Definiție:
Fiecare nod este asociat cu o listă de noduri către care există arce. - Exemplu:
Graful:
(1) → (2)
↑ ↓
(4) ← (3)
Lista de adiacență:
1: 2
2: 3
3: 4
4: 1
- Implementare în C++:
#include <iostream>
#include <vector>
using namespace std;
void afisareListaAdiacenta(int n, vector<int> lista[]) {
for (int i = 0; i < n; i++) {
cout << i + 1 << „: „;
for (int vecin : lista[i]) {
cout << vecin + 1 << ” „;
}
cout << endl;
}
}
int main() {
int n = 4; // Numărul de noduri
vector<int> lista[100];
// Adăugare arce
lista[0].push_back(1); // Arc 1 → 2
lista[1].push_back(2); // Arc 2 → 3
lista[2].push_back(3); // Arc 3 → 4
lista[3].push_back(0); // Arc 4 → 1
cout << „Lista de adiacență:\n”;
afisareListaAdiacenta(n, lista);
return 0;
}
5. Tipuri de grafuri orientate
- Graf orientat simplu:
Nu conține arce multiple sau bucle. - Graf orientat ponderat:
Fiecare arc are o greutate asociată. - Graf aciclic orientat (DAG):
Nu conține cicluri directe. - Graf complet orientat:
Există un arc între oricare două noduri (în ambele sensuri).
6. Aplicații ale grafurilor orientate
- Rețele de flux:
Modelarea transportului sau distribuției de resurse. - Planificarea activităților:
Grafurile aciclice orientate (DAG) sunt utilizate pentru reprezentarea dependențelor între activități. - Drumuri minime:
Algoritmi precum Dijkstra sau Bellman-Ford sunt utilizați pentru grafuri ponderate.
7. Activități practice pentru elevi
- Implementați un program care determină gradul de intrare și gradul de ieșire pentru fiecare nod dintr-un graf orientat.
- Scrieți o funcție care verifică dacă un graf orientat conține cicluri.
- Extindeți implementările pentru a suporta grafuri ponderate.
8. Concluzie
- Grafurile orientate sunt structuri fundamentale pentru modelarea relațiilor direcționate.
- Ele au numeroase aplicații practice în matematică, informatică și științe.
- Înțelegerea reprezentării și caracteristicilor acestora este esențială pentru aplicarea lor în probleme complexe.