fbpx

Teoria Grafurilor – Reprezentarea grafurilor

de Mihai-Alexandru

Definitii

Matricea de adiacenta este o matrice a cu n linii si n coloane, in care elementele a[i, j], se definesc astfel:
a[i, j] = { 1, daca ∃ muchia [i, j], unde i ≠ j
a[i, j] =   0, in caz contrat }

Lista vecinilor nodului x cuprinde toate nodurile care sunt extremitati ale muchiilor ce trec prin nodul x.

Elemente de teorie

Reprezentari

O metoda de reprezentare a unui graf neorientat foarte folosita este matricea de adiacenta. Aceasta are proprietatea ca a[i, j] = a[j, i] oricare ar fi i, j ∈ {1, 2, 3, …, n}, cu i ≠ j. Adica matriea de adiacenta a este simetrica fata de diagonala principala.

Fiecare muchie a grafului poate fi privita ca o inregistrare cu doua componente: cele doua varfuri care constituie extremitatile muchiei. Notand aceste extremitati cu x si y, putem defini tipul de date „Muchie„, astfel:

Varianta C++:

struct Muchie{
int x, y;
}

Astfel ca putem reprezenta graful si ca un „vector de muchii”, adica un vector cu elemente de tipul Muchie:

Varianta C++:

Muchie v[25];

Exemplu:

Un exemplu de graf neorientat cat mai simplu

Matricea de adiacenta:

In acest tabel exemplificam matricea de adiacenta din graful de mai sus.

Lista vecinilor:

Am reprezentat graful de mai sus, sub forma unui tabel.

Vectorul de muchii U = {(1, 2), (2, 3), (2, 4), (3, 4), (5, 6)}

Aplicatii

Construirea matricei de adiacenta pe baza muchiilor citite de la tastatura

Varianta C++:

void citire_graf(int a[10][10], int &n, int &m)
{
  int x, y;
  cout << "Numarul de varfuri: "; cin >> n;
  cout << "Numarul de muchii: "; cin >> m;
  for(int i = 1; i <= n; i++)
  {
    for(int j = 1; j <= n; j++)
    {
      a[i][j] = 0;
    }
  }
  
  for(int i = 1; i <= m; i++)
  {
    cout << "Muchia numarul: " << i;
    do
    {
      cin >> x >> y;
    }
    while(x < 1 || x > n || y < 1 || y > n || x == y)
    a[x][y] = 1;
    a[y][x] = 1;
  }
}

Determinarea muchiilor unui graf pornind de la matricea de adiacenta

Varianta C++:

void afisare_graf()
{
  cout << "Muchiile sunt: ";
  for(int i = 1; i < n; i++)
  {
    for(int j = i + 1; j <= n; j++)
    {
      if(a[i][j] == 1)
        cout << i << " " << j << "\n";
    }
  }
}

Citirea matricei de adiacenta de la tastatura

Varianta C++:

void citire_matrice(int a[10][10], int &n)
{
  cout << "Numarul de varfuri: "; cin >> n;
  for(int i = 1; i <= n; i++)
    a[i][i] = 0;
  for(int i = 1; i < n; i++)
  {
    for(int j = i + 1; j <= n; j++)
    {
      cout << "Scrieti 1 respectiv 0, daca muchia (" << i << ", " << j << ") exista sau nu: ";
      do
      {
        cin >> a[i][j];
      }
      while(a[i][j] != 0 && a[i][j] != 1);
      
      a[j][i] = a[i][j];
    }
  }
}

Citirea matricei de adiacenta dintr-un fisier text

Varianta C++:

#include <fstream>
ifstream fin("fisier.in");
void citire_matrice(int a[10][10], int &n)
{
  fin >> n;
  for(int i = 1; i < n; i++)
  {
    for(int j = i + 1; j <= n; j++)
    {
      fin >> a[i][j];
      a[j][i] = a[i][j];
    }
  }
  fin.close();
}

Determinare gradului unui varf X folosind matricea de adiacenta

Varianta C++:

int grad(int a[10][10], int x)
{
  int grad_nod = 0;
  for(int i = 1; i <= x; i++)
  {
    if(a[x][i] == 1)
      grad_nod ++;
  }
  return grad_nod;
}

 

Comentarii

S-ar putea sa iti placa