Przeczytaj
W tej sekcji znajdziesz przykłady implementacji reprezentacji grafów nieskierowanych bez wag w języku C++. Reprezentacje te zostały przedstawione w e‑materiale teoretycznyme‑materiale teoretycznym, są to macierz sąsiedztwa, lista sąsiedztwa, macierz incydencji.
Grafy nieskierowane
Macierz sąsiedztwa
Dany jest następujący graf spójny nieskierowany bez wag:

Jego macierz sąsiedztwa wygląda tak:

Na potrzeby naszej implementacji macierz sąsiedztwa będzie dwuwymiarową tablicą statyczną o n wierszach i n kolumnach (n to liczba wierzchołków grafu), przechowującą elementy typu int.
Łączenie wierzchołków nowymi krawędziami zrealizujemy za pomocą funkcji polaczWierzcholki(). Funkcja przyjmuje dwa argumenty i oraz j typu int będące indeksami dwóch wierzchołków, które chcemy połączyć. Aby to zrobić, należy wyrazom macierzSasiedztwa[i][j] i macierzSasiedztwa[j][i] przypisać wartość 1.
Następna funkcja, która wypisze wszystkie wyrazy macierzy sąsiedztwa, ułatwi nam obserwację zmian wartości wyrazów macierzy po każdym uruchomieniu funkcji polaczWierzcholki().
Przykładowe wywołanie wymienionych funkcji możemy znaleźć poniżej. Tablica macierzSasiedztwa[] jest w naszym kodzie zmienną globalnązmienną globalną zdefiniowaną w programie nad funkcją main().
Kod programu:
Wynik działania programu:
Przyjrzyjmy się graficznemu przedstawieniu wyniku.
Tak wygląda pierwotna postać macierzy:

Chcemy połączyć wierzchołek 0 oraz 5:

Po połączeniu macierz wygląda następująco:

Sytuacja wygląda analogicznie w przypadku łączenia innych wierzchołków.
Lista sąsiedztwa
Dany jest następujący graf spójny nieskierowany bez wag:

Jego lista sąsiedztwa wygląda następująco:

W języku C++ możemy skorzystać ze standardowej biblioteki szablonów (STLSTL), w której znajduje się implementacja klasy vector. Wektory to kontenery ciągu liczb reprezentujące tablice, których rozmiar może się zmieniać i nie wymagana jest jego deklaracja. Przykładowa implementacja tego kontenera została przedstawiona w filmie w e‑materiale Wprowadzenie do teorii grafów w języku C++Wprowadzenie do teorii grafów w języku C++.
Aby uzyskać dostęp do klasy, importujemy bibliotekę <vector>. Ponieważ vector jest szablonem klasy, należy przy deklaracji listy określić typ przechowywanych elementów. W omawianym przypadku będzie to typ int.
Klasa oferuje wiele metod, jednak skupimy się tylko na jednej z nich, czyli metodzie push_back(), która dodaje nowy element na końcu wektora. Za jej pomocą będziemy łączyć wierzchołki w grafie, dodając indeks jednego wierzchołka do listy sąsiadów drugiego.
Każdy wierzchołek potrzebuje osobnego wektora sąsiadów, więc całą listę sąsiedztwa przedstawimy za pomocą tablicy statycznej o wyrazach typu vector<int>. Tablicę wektorów możemy zainicjować pewnymi wyrazami w podobny sposób, jak inicjujemy wyrazy tablic statycznych.
Jeśli dwa wierzchołki i oraz j chcemy połączyć krawędzią, to do wektora listaSasiedztwa[i] dodajemy wierzchołek j, a do listaSasiedztwa[j] wierzchołek i.
Aby wypisać zawartość wektora vector, należy użyć pętli zasięguzasięgu, która iteruje po każdym elemencie wektora niezależnie od jego rozmiaru. Taką pętlę definiujemy następująco:
Mając na uwadze powyższe własności wektorów, możemy przejść do napisania funkcji wypisz().
Wszystkie funkcje opisane w tej sekcji są kompatybilne z pętlą główną programu opisaną dla macierzy sąsiedztwa, dlatego też można je przetestować bez konieczności napisania nowej funkcji main().
Kod programu:
Wyjście programu:
Przyjrzyj się temu, jak w pierwszym przypadku zmieniły się wiersze nr 10 oraz 15.
W drugim przypadku zwróć uwagę na wiersze nr 20 oraz 22.
Macierz incydencji
Dany jest następujący graf spójny nieskierowany bez wag:

Jego macierz incydencji wygląda tak:

Analogicznie do macierzy sąsiedztwa inicjujemy macierz incydencji jako dwuwymiarową tablicę statyczną.
Używamy dyrektywy define E 20, by określić maksymalną liczbę krawędzi w grafie.
Tablica zawiera E kolumn, ale wykorzystywanych jest m kolumn. Wykorzystujemy m kolumn, a pozostałym wyrazom przypisywana jest domyślnie wartość 0.
Zmienna globalna m przechowuje aktualną liczbę krawędzi w grafie i będzie zwiększana o jeden przy każdym udanym połączeniu wierzchołków. Udanym, ponieważ przy każdym wywołaniu funkcja polaczWierzcholki() sprawdzać będzie, czy dodanie nowej krawędzi jest możliwe, a więc czy tablica nie została już zapełniona.
Funkcja wypisz() jest bardzo podobna do jej odpowiednika dla macierzy sąsiedztwa, bo zmienia się tylko zasięg wewnętrznej pętli. Warunek j < n przyjmie tym razem postać j < m.
Kod programu:
Wynik działania programu:
Zwróć uwagę, że po prawej stronie pojawiły się nowe kolumny – odpowiadają nowo powstałym krawędziom grafu.
Słownik
struktura składająca się z niepustego zbioru wierzchołków oraz rodziny krawędzi; dla grafu G zbiór wierzchołków oznaczamy jako V(G) (ang. verticies – wierzchołki), a zbiór krawędzi – E(G) (ang. edges – krawędzie); liczbę elementów zbioru V(G) oznaczamy literą n; liczbę elementów zbioru E(G) – m (opracowano na podstawie: R. Wilson, Wprowadzenie do teorii grafów, PWN, Warszawa 2007)
graf, w którym każda para wierzchołków połączona jest drogą
graf którego krawędzie mają przypisane wagi
relacja między dwoma wierzchołkami a łączącą je krawędzią; mówimy, że dwa sąsiednie wierzchołki połączone pewną krawędzią są incydentne z tą krawędzią
własność grafów mówiąca o tym, że liczba krawędzi łączących dane dwa wierzchołki jednego grafu jest równa liczbie krawędzi łączących odpowiadające im wierzchołki drugiego grafu (opracowano na podstawie: R. Wilson, Wprowadzenie do teorii grafów, PWN, Warszawa 2007)
nieuporządkowana para (niekoniecznie różnych) elementów zbioru wierzchołków (opracowano na podstawie: R. Wilson, Wprowadzenie do teorii grafów, PWN, Warszawa 2007)
zestaw uporządkowanych list, gdzie lista o indeksie jest listą wszystkich sąsiadów wierzchołka
dwuwymiarowa tablica elementów (zwykle liczbowych), licząca wierszy i kolumn
macierz zerojedynkowa rozmiaru , dla której każda krawędź grafu musi mieć unikatowy indeks; wyraz jest równy , o ile krawędź o indeksie jest incydentna do wierzchołka
macierz zerojedynkowa rozmiaru , w której wyraz jest równy , jeśli wierzchołki oraz są sąsiednie, a w przeciwnym przypadku; macierz sąsiedztwa jest symetryczna dla grafów nieskierowanych
ścieżka w grafie o najmniejszej sumie wag wszystkich krawędzi należących do ścieżki
pętla for pozwalająca iterować przez zdefiniowany zakres
biblioteka dla języka C++, zawierająca cztery komponenty zwane algorytmami, kontenerami, funkcjami i iteratorami; STL posiada zestaw zdefiniowanych szablonów klas, między innymi vector, list, set, map, queue, stack i wiele więcej
liczba krawędzi incydentnych z danym wierzchołkiem (opracowano na podstawie: R. Wilson, Wprowadzenie do teorii grafów, PWN, Warszawa 2007)
wartość przypisana krawędzi grafu
pojedynczy punkt w przestrzeni, który wraz ze zbiorem krawędzi (będących parami wierzchołków) tworzy graf; krawędzie wychodzą z wierzchołka i łączą się w nim
zmienna istniejąca przez cały czas życia programu i widziana z wielu miejsc w programie