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 teoretycznymPpkZaFlK1e‑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:

R1OA3UoJEctUA
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Jego macierz sąsiedztwa wygląda tak:

R12LrCWhJbLTN
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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.

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka define n 6. Linia 3. using namespace std średnik. Linia 5. int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy. Linia 6. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 7. otwórz nawias klamrowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 8. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek. Linia 9. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 10. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek. Linia 11. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy. Linia 12. zamknij nawias klamrowy średnik.

Łą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.

Linia 1. void polaczWierzcholki otwórz nawias okrągły int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości 1 średnik. Linia 3. macierzSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 1 średnik. Linia 4. zamknij nawias klamrowy.

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().

Linia 1. void wypisz otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik j plus plus zamknij nawias okrągły. Linia 4. cout otwórz nawias ostrokątny otwórz nawias ostrokątny macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 6. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 7. zamknij nawias klamrowy. Linia 8. zamknij nawias klamrowy.

Przykładowe wywołanie wymienionych funkcji możemy znaleźć poniżej. Tablica macierzSasiedztwa[] jest w naszym kodzie zmienną globalnązmienna globalnazmienną globalną zdefiniowaną w programie nad funkcją main().

Linia 1. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Pierwotna postac dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 3. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 6. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 7. polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik. Linia 8. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 9. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 11. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 12. polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik. Linia 13. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 15. return 0 średnik. Linia 16. zamknij nawias klamrowy.

Kod programu:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka define n 6. Linia 3. using namespace std średnik. Linia 5. int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy. Linia 6. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 7. otwórz nawias klamrowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 8. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek. Linia 9. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 10. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek. Linia 11. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy. Linia 12. zamknij nawias klamrowy średnik. Linia 14. void polaczWierzcholki otwórz nawias okrągły int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości 1 średnik. Linia 16. macierzSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 1 średnik. Linia 17. zamknij nawias klamrowy. Linia 19. void wypisz otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 20. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 21. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik j plus plus zamknij nawias okrągły. Linia 22. cout otwórz nawias ostrokątny otwórz nawias ostrokątny macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 24. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 25. zamknij nawias klamrowy. Linia 26. zamknij nawias klamrowy. Linia 28. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 29. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Pierwotna postac dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 30. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 31. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 33. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 34. polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik. Linia 35. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 36. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 38. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 39. polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik. Linia 40. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 42. return 0 średnik. Linia 43. zamknij nawias klamrowy.

Wynik działania programu:

Linia 1. Pierwotna postac dwukropek. Linia 2. 0 1 1 0 1 0. Linia 3. 1 0 1 0 1 0. Linia 4. 1 1 0 1 0 1. Linia 5. 0 0 1 0 1 0. Linia 6. 1 1 0 1 0 1. Linia 7. 0 0 1 0 1 0. Linia 9. polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik. Linia 10. 0 1 1 0 1 1. Linia 11. 1 0 1 0 1 0. Linia 12. 1 1 0 1 0 1. Linia 13. 0 0 1 0 1 0. Linia 14. 1 1 0 1 0 1. Linia 15. 1 0 1 0 1 0. Linia 17. polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik. Linia 18. 0 1 1 0 1 1. Linia 19. 1 0 1 0 1 0. Linia 20. 1 1 0 1 1 1. Linia 21. 0 0 1 0 1 0. Linia 22. 1 1 1 1 0 1. Linia 23. 1 0 1 0 1 0.

Przyjrzyjmy się graficznemu przedstawieniu wyniku.

Tak wygląda pierwotna postać macierzy:

RMZb5uA3j5aOO
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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

RVITL4mqUTBis
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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

Rue4hjdslZXQk
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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:

R1OA3UoJEctUA
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

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

Rri8wpXPrqHIU
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W języku C++ możemy skorzystać ze standardowej biblioteki szablonów (STLStandard Template LibrarySTL), 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++P7Y9tbXxGWprowadzenie 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.

Linia 1. vector otwórz nawias ostrokątny int zamknij nawias ostrokątny wektor średnik.

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.

Linia 1. vector otwórz nawias ostrokątny int zamknij nawias ostrokątny wektor średnik. Linia 3. wektor kropka push podkreślnik back otwórz nawias okrągły 4 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik wektor dwukropek 4. Linia 4. wektor kropka push podkreślnik back otwórz nawias okrągły 5 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik wektor dwukropek 4 przecinek 5. Linia 5. wektor kropka push podkreślnik back otwórz nawias okrągły 7 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik wektor dwukropek 4 przecinek 5 przecinek 7.

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.

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny vector zamknij nawias ostrokątny. Linia 3. kratka define n 6. Linia 4. using namespace std średnik. Linia 6. vector otwórz nawias ostrokątny int zamknij nawias ostrokątny listaSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy. Linia 7. otwórz nawias klamrowy 1 przecinek 2 przecinek 4 zamknij nawias klamrowy przecinek. Linia 8. otwórz nawias klamrowy 0 przecinek 2 przecinek 4 zamknij nawias klamrowy przecinek. Linia 9. otwórz nawias klamrowy 0 przecinek 1 przecinek 3 przecinek 5 zamknij nawias klamrowy przecinek. Linia 10. otwórz nawias klamrowy 2 przecinek 4 zamknij nawias klamrowy przecinek. Linia 11. otwórz nawias klamrowy 0 przecinek 1 przecinek 3 przecinek 5 zamknij nawias klamrowy przecinek. Linia 12. otwórz nawias klamrowy 2 przecinek 4 zamknij nawias klamrowy. Linia 13. zamknij nawias klamrowy średnik.

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.

Linia 1. void polaczWierzcholki otwórz nawias okrągły int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. listaSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka push podkreślnik back otwórz nawias okrągły j zamknij nawias okrągły średnik. Linia 3. listaSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka push podkreślnik back otwórz nawias okrągły i zamknij nawias okrągły średnik. Linia 4. zamknij nawias klamrowy.

Aby wypisać zawartość wektora vector, należy użyć pętli zasięgupętla zasięgu (zakresowa)zasięgu, która iteruje po każdym elemencie wektora niezależnie od jego rozmiaru. Taką pętlę definiujemy następująco:

Linia 1. for otwórz nawias okrągły int wyraz dwukropek lista zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. cout otwórz nawias ostrokątny otwórz nawias ostrokątny wyraz otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 4. zamknij nawias klamrowy.

Mając na uwadze powyższe własności wektorów, możemy przejść do napisania funkcji wypisz().

Linia 1. void wypisz otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. cout otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów dwukropek cudzysłów średnik. Linia 4. for otwórz nawias okrągły int sasiad dwukropek listaSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 5. cout otwórz nawias ostrokątny otwórz nawias ostrokątny sasiad otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 6. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 7. zamknij nawias klamrowy. Linia 8. zamknij nawias klamrowy.

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:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny vector zamknij nawias ostrokątny. Linia 3. kratka define n 6. Linia 4. using namespace std średnik. Linia 6. vector otwórz nawias ostrokątny int zamknij nawias ostrokątny listaSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy. Linia 7. otwórz nawias klamrowy 1 przecinek 2 przecinek 4 zamknij nawias klamrowy przecinek. Linia 8. otwórz nawias klamrowy 0 przecinek 2 przecinek 4 zamknij nawias klamrowy przecinek. Linia 9. otwórz nawias klamrowy 0 przecinek 1 przecinek 3 przecinek 5 zamknij nawias klamrowy przecinek. Linia 10. otwórz nawias klamrowy 2 przecinek 4 zamknij nawias klamrowy przecinek. Linia 11. otwórz nawias klamrowy 0 przecinek 1 przecinek 3 przecinek 5 zamknij nawias klamrowy przecinek. Linia 12. otwórz nawias klamrowy 2 przecinek 4 zamknij nawias klamrowy. Linia 13. zamknij nawias klamrowy średnik. Linia 15. void polaczWierzcholki otwórz nawias okrągły int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. listaSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka push podkreślnik back otwórz nawias okrągły j zamknij nawias okrągły średnik. Linia 17. listaSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka push podkreślnik back otwórz nawias okrągły i zamknij nawias okrągły średnik. Linia 18. zamknij nawias klamrowy. Linia 20. void wypisz otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 21. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. cout otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów dwukropek cudzysłów średnik. Linia 23. for otwórz nawias okrągły int sasiad dwukropek listaSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 24. cout otwórz nawias ostrokątny otwórz nawias ostrokątny sasiad otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 25. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 26. zamknij nawias klamrowy. Linia 27. zamknij nawias klamrowy. Linia 29. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 30. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Pierwotna postac dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 31. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 32. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 34. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 35. polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik. Linia 36. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 37. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 39. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 40. polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik. Linia 41. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 43. return 0 średnik. Linia 44. zamknij nawias klamrowy.

Wyjście programu:

Linia 1. Pierwotna postac dwukropek. Linia 2. 0 dwukropek 1 2 4. Linia 3. 1 dwukropek 0 2 4. Linia 4. 2 dwukropek 0 1 3 5. Linia 5. 3 dwukropek 2 4. Linia 6. 4 dwukropek 0 1 3 5. Linia 7. 5 dwukropek 2 4. Linia 9. polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik. Linia 10. 0 dwukropek 1 2 4 5. Linia 11. 1 dwukropek 0 2 4. Linia 12. 2 dwukropek 0 1 3 5. Linia 13. 3 dwukropek 2 4. Linia 14. 4 dwukropek 0 1 3 5. Linia 15. 5 dwukropek 2 4 0. Linia 17. polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik. Linia 18. 0 dwukropek 1 2 4 5. Linia 19. 1 dwukropek 0 2 4. Linia 20. 2 dwukropek 0 1 3 5 4. Linia 21. 3 dwukropek 2 4. Linia 22. 4 dwukropek 0 1 3 5 2. Linia 23. 5 dwukropek 2 4 0.

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:

R1SLuEuzVC4ye
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Jego macierz incydencji wygląda tak:

R1LgaRvPCSjMs
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Analogicznie do macierzy sąsiedztwa inicjujemy macierz incydencji jako dwuwymiarową tablicę statyczną.

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka define n 6. Linia 3. kratka define E 20. Linia 4. using namespace std średnik. Linia 5. int m znak równości 9 średnik. Linia 7. int macierzIncydencji otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy E zamknij nawias kwadratowy znak równości otwórz nawias klamrowy. Linia 8. otwórz nawias klamrowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias klamrowy przecinek. Linia 9. otwórz nawias klamrowy 1 przecinek 0 przecinek 0 przecinek 1 przecinek 1 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias klamrowy przecinek. Linia 10. otwórz nawias klamrowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 przecinek 0 przecinek 0 zamknij nawias klamrowy przecinek. Linia 11. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 12. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 0 przecinek 1 przecinek 1 zamknij nawias klamrowy przecinek. Linia 13. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek. Linia 14. zamknij nawias klamrowy średnik.

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.

Linia 1. void polaczWierzcholki otwórz nawias okrągły int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły m zamknij nawias ostrokątny znak równości E zamknij nawias okrągły return średnik. Linia 4. macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości 1 średnik. Linia 5. macierzIncydencji otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości 1 średnik. Linia 6. m plus plus średnik. Linia 7. zamknij nawias klamrowy.

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.

Linia 1. void wypisz otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny m średnik j plus plus zamknij nawias okrągły. Linia 4. cout otwórz nawias ostrokątny otwórz nawias ostrokątny macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 5. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 6. zamknij nawias klamrowy. Linia 7. zamknij nawias klamrowy.

Kod programu:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. kratka define n 6. Linia 3. kratka define E 20. Linia 4. using namespace std średnik. Linia 5. int m znak równości 9 średnik. Linia 7. int macierzIncydencji otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy E zamknij nawias kwadratowy znak równości otwórz nawias klamrowy. Linia 8. otwórz nawias klamrowy 1 przecinek 1 przecinek 1 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias klamrowy przecinek. Linia 9. otwórz nawias klamrowy 1 przecinek 0 przecinek 0 przecinek 1 przecinek 1 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias klamrowy przecinek. Linia 10. otwórz nawias klamrowy 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 1 przecinek 0 przecinek 0 zamknij nawias klamrowy przecinek. Linia 11. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek. Linia 12. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 0 przecinek 1 przecinek 1 zamknij nawias klamrowy przecinek. Linia 13. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek. Linia 14. zamknij nawias klamrowy średnik. Linia 16. void polaczWierzcholki otwórz nawias okrągły int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. if otwórz nawias okrągły m zamknij nawias ostrokątny znak równości E zamknij nawias okrągły return średnik. Linia 19. macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości 1 średnik. Linia 20. macierzIncydencji otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości 1 średnik. Linia 21. m plus plus średnik. Linia 22. zamknij nawias klamrowy. Linia 24. void wypisz otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 25. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 26. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny m średnik j plus plus zamknij nawias okrągły. Linia 27. cout otwórz nawias ostrokątny otwórz nawias ostrokątny macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów cudzysłów średnik. Linia 28. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 29. zamknij nawias klamrowy. Linia 30. zamknij nawias klamrowy. Linia 32. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 33. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Pierwotna postac dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 34. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 35. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 37. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 38. polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik. Linia 39. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 40. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 42. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 43. polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik. Linia 44. wypisz otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 46. return 0 średnik. Linia 47. zamknij nawias klamrowy.

Wynik działania programu:

Linia 1. Pierwotna postac dwukropek. Linia 2. 1 1 1 0 0 0 0 0 0. Linia 3. 1 0 0 1 1 0 0 0 0. Linia 4. 0 1 0 1 0 1 1 0 0. Linia 5. 0 0 0 0 0 1 0 1 0. Linia 6. 0 0 1 0 1 0 0 1 1. Linia 7. 0 0 0 0 0 0 1 0 1. Linia 9. polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły średnik. Linia 10. 1 1 1 0 0 0 0 0 0 1. Linia 11. 1 0 0 1 1 0 0 0 0 0. Linia 12. 0 1 0 1 0 1 1 0 0 0. Linia 13. 0 0 0 0 0 1 0 1 0 0. Linia 14. 0 0 1 0 1 0 0 1 1 0. Linia 15. 0 0 0 0 0 0 1 0 1 1. Linia 17. polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły średnik. Linia 18. 1 1 1 0 0 0 0 0 0 1 0. Linia 19. 1 0 0 1 1 0 0 0 0 0 0. Linia 20. 0 1 0 1 0 1 1 0 0 0 1. Linia 21. 0 0 0 0 0 1 0 1 0 0 0. Linia 22. 0 0 1 0 1 0 0 1 1 0 1. Linia 23. 0 0 0 0 0 0 1 0 1 1 0.

Zwróć uwagę, że po prawej stronie pojawiły się nowe kolumny – odpowiadają nowo powstałym krawędziom grafu.

Słownik

graf
graf

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 spójny
graf spójny

graf, którego nie można przedstawić w postaci sumy dwóch grafów (opracowano na podstawie: R. WilsonWprowadzenie do teorii grafów, PWN, Warszawa 2007)

incydencja
incydencja

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ą

izomorfizm
izomorfizm

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. WilsonWprowadzenie do teorii grafów, PWN, Warszawa 2007)

krawędź
krawędź

nieuporządkowana para (niekoniecznie różnych) elementów zbioru wierzchołków (opracowano na podstawie: R. WilsonWprowadzenie do teorii grafów, PWN, Warszawa 2007)

lista sąsiedztwa
lista sąsiedztwa

zestaw |V| uporządkowanych list, gdzie lista o indeksie jest listą wszystkich sąsiadów wierzchołka

macierz
macierz

dwuwymiarowa tablica elementów (zwykle liczbowych), licząca n wierszy i m kolumn

macierz incydencji
macierz incydencji

macierz zerojedynkowa rozmiaru |V|×|E|, 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 sąsiedztwa
macierz sąsiedztwa

macierz zerojedynkowa rozmiaru |V|×|V|, 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

pętla zasięgu (zakresowa)
pętla zasięgu (zakresowa)

pętla for pozwalająca iterować przez zdefiniowany zakres

Standard Template Library
Standard Template Library

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

stopień wierzchołka
stopień wierzchołka

liczba krawędzi incydentnych z danym wierzchołkiem (opracowano na podstawie: R. WilsonWprowadzenie do teorii grafów, PWN, Warszawa 2007)

wierzchołek
wierzchołek

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 globalna
zmienna globalna

zmienna istniejąca przez cały czas życia programu i widziana z wielu miejsc w programie