Reprezentacja grafu
Reprezentacja grafu to sposób zapisu grafu, który umożliwia jego przetwarzanie w programach komputerowych. Dwa najpopularniejsze metody to macierz sąsiedztwa oraz lista sąsiedztwa. W matematyce graf składa się ze zbioru wierzchołków i zbioru krawędzi . Wierzchołki mogą być reprezentowane przez różne struktury danych, na przykład klasy.
Reprezentacja przez macierz sąsiedztwa
Macierz sąsiedztwa to dwuwymiarowa tablica o wymiarach na . Jeśli istnieje krawędź między wierzchołkami i , to , w przeciwnym razie .
- Wymagania pamięciowe:
- Dodanie krawędzi: czas stały
- Sprawdzenie krawędzi: czas stały
- Sprawdzenie stopnia wierzchołka:
- Usunięcie krawędzi: czas stały
Reprezentacja przez listę sąsiedztwa
Lista sąsiedztwa jest efektywną reprezentacją, zwłaszcza dla grafów rzadkich. Wykorzystuje struktury danych w postaci list, które przechowują numery sąsiadów dla każdego wierzchołka.
- Wymagania pamięciowe:
- Dodanie krawędzi: czas stały
- Sprawdzenie krawędzi:
- Sprawdzenie stopnia wierzchołka:
- Usunięcie krawędzi:
Reprezentacja przez pęki wyjściowe
W przypadku niezmiennego grafu podczas działania algorytmu można użyć struktury pęków wyjściowych. W tej metodzie sąsiedzi są przechowywani w jednej tablicy, co umożliwia szybkie obliczenie stopnia wierzchołka.
- Wymagania pamięciowe:
- Dodanie krawędzi:
- Sprawdzenie krawędzi:
- Sprawdzenie stopnia wierzchołka:
- Usunięcie krawędzi:
Implementacja grafu w C++
Implementacja grafu przy użyciu macierzy jest prosta. Poniżej przedstawiono przykładową klasę dla reprezentacji macierzowej.
class CGraph
{
unsigned V,E; // liczba wierzchołków i krawędzi
bool DiGraph; // czy digraf?
bool MultiGraph; // czy multigraf?
unsigned **GMatrix; // macierz
//*******************************************************//
public:
CGraph(unsigned _V, bool _di, bool _mu);
~CGraph();
bool Insert(unsigned v,unsigned u);
bool Delete(unsigned v,unsigned u);
unsigned Degree(unsigned v);
bool Search(unsigned v,unsigned u);
};
Konstruktor rezerwuje pamięć na macierz sąsiedztwa i tworzy graf o wierzchołkach i krawędziach. W przypadku reprezentacji listowej, klasa jest podobna, ale używa wskaźników do list sąsiadów.
- Implementacja reprezentacji listowej także wymaga rezerwacji pamięci na tablicę wskaźników oraz inicjalizacji list sąsiadów.
Obie implementacje pozwalają na dodawanie, usuwanie oraz sprawdzanie krawędzi w grafie.