Ilustracja przedstawia namalowany portret Leonharda Eulera. Mężczyzna ma na sobie niebieską koszulę oraz białą czapkę. Ma niebieskie oczy i nie ma zarostu.
Portret Leonharda Eulera
Źródło: JakobEmanuelHandmann, dostępny w internecie: pl.wikipedia.org [dostęp 26.12.2023], domena publiczna.
Jak wspomnieliśmy we wprowadzeniu, w tym e‑materiale zajmiemy się między innymi algorytmem, za pomocą którego sprawdzimy, czy dany grafgrafgraf zawiera cyklcyklcyklEulera (tzn. czy jest grafem eulerowskim).
O grafie mówimy, że jest grafem eulerowskim, jeśli istnieje w nim cykl, który zawiera każdą jego krawędź.
Wiemy już, że spójny graf zawiera cykl Eulera wtedy i tylko wtedy, gdy każdy wierzchołek jest parzystego stopnia. To, czy wierzchołki są parzystego stopnia, możemy odczytać np. z macierzy sąsiedztwa danego grafu czy z ilustracji go przedstawiającej.
Tak prezentuje się graf przedstawiający mosty i lądy w Królewcu z czasów Eulera (problem ten został omówiony w e‑materiale Zagadnienie mostów królewieckichPwWUgv9LEZagadnienie mostów królewieckich):
R1R1e2UlsUpOf
Ilustracja przedstawia graf. Znajdują się na nim trzy punkty podpisane wielkimi literami A, C, D oraz jeden nieopisany punkt. Punkty C, A oraz punkt nieopisany leżą na okręgu, w taki sposób, że punkt C leży naprzeciwko punktu nieopisanego, a punkt A pomiędzy nimi. Punkt te znajduje się na końcu poziomego odcinka pomiędzy punktem A oraz d, przy czym nie leży on na linii okręgu. Pomiędzy punktem A i C oraz A i punktem nieopisanym znajdują się dodatkowe krzywe łączące te punkty. Punkty C i D oraz D i punkt nieopisany są połączone prostymi odcinkami.
Nieskierowany spójny graf, który przedstawia mosty i lądy w Królewcu z czasów Eulera.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Graf przedstawiający pięć mostów współczesnego Królewca:
R1AIRY8pYxPSN
Ilustracja przedstawia czworokąt przypominający deltoid, jego punkty oznaczono dużymi literami a, b, c, d. małymi literami oznaczono jego ściany, prosta ab to a, prosta bd to b, prosta cd to d, prosta ca to c, a prosta ad to e.
Graf nieskierowany bez wag, który składa się z czterech wierzchołków oraz pięciu krawędzi. Graf przedstawia mosty współczesnego Królewca.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Macierz sąsiedztwa zaprezentowanego grafu:
By graf zawierał cykl Eulera, wszystkie jego wierzchołki muszą być parzystego stopnia.
Sprawdźmy, czy graf reprezentowany przedstawioną macierzą sąsiedztwa jest grafem eulerowskim. Zacznijmy od sprawdzenia stopnia wierzchołka oznaczonego jako wierzchołek A.
Musimy odczytać zatem informacje zawarte w pierwszym wierszu macierzy. Wierzchołek A nie jest połączony krawędzią z samym sobą (nie zawiera zatem pętli). Jest natomiast połączony krawędzią z wierzchołkami B, C oraz D (ponieważ w komórkach odpowiadających tym wierzchołkom znajdują się jedynki).
Zatem z wierzchołka wychodzą trzy krawędzie. Stopień tego wierzchołka wynosi więc trzy, w konsekwencji graf nie jest grafem eulerowskim.
Przejdźmy do pseudkodu algorytmu sprawdzania, czy graf zawiera cykl Eulera.
komunikat informujący o tym, czy graf zawiera cykl Eulera (tzn. czy jest grafem eulerowskim)
Spójny graf zawiera cykl Eulera wtedy i tylko wtedy, gdy każdy wierzchołek jest parzystego stopnia. To, czy wierzchołki są parzystego stopnia, możemy odczytać z macierzy sąsiedztwa danego grafu.
Dany jest następujący graf spójny nieskierowany bez wag:
R18enn1SlDMh3
Ilustracja przedstawia pięciokąt wypukły. Jego wierzchołki są oznaczone kolejno cyframi 4, 0, 1, 2, 5. Wierzchołek 4 oraz 1 jest połączony przekątną, tak samo jak wierzchołek 2 i 0. Z wierzchołka 4 oraz 2 wychodzą proste, które spotykają się w punkcie oznaczonym 3, który znajduje się wewnątrz figury. Wszystkie wierzchołki i punkty są oznaczone niebieskimi kółkami.
Graf spójny nieskierowany, który składa się z sześciu wierzchołków i dziewięciu krawędzi.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Macierz sąsiedztwa zaprezentowanego grafu:
Ponieważ nie wszystkie wierzchołki grafu (tj. wierzchołki 0 oraz 1) są parzystego stopnia, graf nie jest grafem eulerowskim (nie zawiera cyklu Eulera).
W programie wykorzystamy funkcję służącą do obliczania stopni wierzchołków grafu. Od niej zaczniemy.
Funkcja jako argument przyjmuje macierz sąsiedztwa grafu.
Zapiszmy jej nagłówek.
Linia 1. funkcja otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny stopnieWierzchołkówWGrafie otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny otwórz nawias okrągły otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny macierzSąsiedztwa otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny przecinek otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny stopnieWierzchołków otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny zamknij nawias okrągły dwukropek.
Zaczynamy od utworzenia zmiennej n, której przypisujemy liczbę wierzchołków grafu, czyli długość tablicy macierzSąsiedztwa. W kolejnym kroku tworzymy tablicę stopnieWierzchołków o długości n i wypełniamy ją zerami. Tablica będzie przechowywać informacje na temat stopni kolejnych wierzchołków.
Linia 1. funkcja stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa przecinek stopnieWierzchołków zamknij nawias okrągły dwukropek.
Linia 2. n ← długość otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 3. stopnieWierzchołków ← otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
funkcja stopnieWierzchołkówWGrafie(macierzSąsiedztwa, stopnieWierzchołków):
n ← długość(macierzSąsiedztwa)
stopnieWierzchołków ← [0] * n
Zapisujemy pętlę dla, która będzie iterować przez kolejne wierzchołki grafu. W tej pętli zapisujemy zagnieżdżoną pętlę dla, która również będzie iterować przez wierzchołki grafu.
W pętli zagnieżdżonej zapisujemy instrukcję warunkową, w której sprawdzimy, czy istnieje krawędź łącząca dwa wierzchołki. Jeśli tak, wartość odpowiedniego elementu tablicy stopnieWierzchołków zostanie zwiększona o 1.
Linia 1. funkcja stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa przecinek stopnieWierzchołków zamknij nawias okrągły dwukropek.
Linia 2. n ← długość otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 3. stopnieWierzchołków ← otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 5. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 6. jeżeli macierzSąsiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 7. stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy ← stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy plus 1.
funkcja stopnieWierzchołkówWGrafie(macierzSąsiedztwa, stopnieWierzchołków):
n ← długość(macierzSąsiedztwa)
stopnieWierzchołków ← [0] * n
dla i = 0, 1, ..., n - 1 wykonuj:
dla j = 0, 1, ..., n - 1 wykonuj:
jeżeli macierzSąsiedztwa[i][j] != 0:
stopnieWierzchołków[i] ← stopnieWierzchołków[i] + 1
Wewnątrz tej instrukcji warunkowej zapisujemy kolejną, która zwiększy wartość tego elementu drugi raz, jeśli krawędź to pętla (czyli wychodzi z tego samego wierzchołka, do którego wchodzi).
Funkcja zwraca tablicę stopnieWierzchołków.
Linia 1. funkcja stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa przecinek stopnieWierzchołków zamknij nawias okrągły dwukropek.
Linia 2. n ← długość otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 3. stopnieWierzchołków ← otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 5. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 6. jeżeli macierzSąsiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 7. stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy ← stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy plus 1.
Linia 8. jeżeli i znak równości j dwukropek.
Linia 9. stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy ← stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy plus 1.
Linia 11. zwróć stopnieWierzchołków.
funkcja stopnieWierzchołkówWGrafie(macierzSąsiedztwa, stopnieWierzchołków):
n ← długość(macierzSąsiedztwa)
stopnieWierzchołków ← [0] * n
dla i = 0, 1, ..., n - 1 wykonuj:
dla j = 0, 1, ..., n - 1 wykonuj:
jeżeli macierzSąsiedztwa[i][j] != 0:
stopnieWierzchołków[i] ← stopnieWierzchołków[i] + 1
jeżeli i = j:
stopnieWierzchołków[i] ← stopnieWierzchołków[i] + 1
zwróć stopnieWierzchołków
Przejdźmy do zapisania funkcji odpowiedzialnej za sprawdzenie, czy w danym grafie reprezentowanym macierzą sąsiedztwa znajduje się cykl Eulera.
Zaczynamy od zapisania nagłówka funkcji istnienieCykluEulera, która jako argument przyjmuje macierz sąsiedztwa macierzSąsiedztwa.
Linia 1. funkcja istnienieCykluEulera otwórz nawias okrągły otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny macierzSąsiedztwa otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny zamknij nawias okrągły dwukropek.
funkcja istnienieCykluEulera(macierzSąsiedztwa):
Zaczynamy stworzenia pustej tablicy stopnieWierzchołków, a następnie wywołania funkcji stopnieWierzchołkówWGrafie i przypisania wyników jej działania utworzonej tablicy stopnieWierzchołków.
Zapisujemy pętlę dla, która będzie iterować przez kolejne elementy tablicy stopnieWierzchołków. W pętli zapisujemy instrukcję warunkową. Instrukcja warunkowa dla każdego elementu tablicy stopnieWierzchołków sprawdzi, czy jest on liczbą parzystą, czyli czy dzieli się przez liczbę 2 bez reszty.
Jeśli liczba nie dzieli się przez 2 bez reszty, zwiększamy wartość licznika liczbaNieparzystych o 1.
Linia 1. funkcja istnienieCykluEulera otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły dwukropek.
Linia 2. stopnieWierzchołków ← utwórz pustą tablicę.
Linia 3. stopnieWierzchołków ← stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 4. liczbaNieparzystych ← 0.
Linia 6. dla stopień w stopnieWierzchołków wykonuj dwukropek.
Linia 7. jeżeli stopień mod 2 wykrzyknik znak równości 0 dwukropek.
Linia 8. liczbaNieparzystych ← liczbaNieparzystych plus 1.
funkcja istnienieCykluEulera(macierzSąsiedztwa):
stopnieWierzchołków ← utwórz pustą tablicę
stopnieWierzchołków ← stopnieWierzchołkówWGrafie(macierzSąsiedztwa)
liczbaNieparzystych ← 0
dla stopień w stopnieWierzchołków wykonuj:
jeżeli stopień mod 2 != 0:
liczbaNieparzystych ← liczbaNieparzystych + 1
Po zakończeniu pętli zostaje obliczona liczba wierzchołków o stopniu nieparzystym.
Zapisujemy kolejną instrukcję warunkową, której zadaniem będzie wypisanie odpowiedniego komunikatu na podstawie tego, czy przynajmniej jeden z wierzchołków grafu ma nieparzysty stopień. Jeśli nie, graf jest grafem eulerowskim –zawiera cykl Eulera. Wypisujemy odpowiedni komunikat.
Jeśli zaś graf ma przynajmniej jeden wierzchołek stopnia nieparzystego, graf nie zawiera cyklu Eulera. Wypisujemy wtedy odpowiedni komunikat.
Linia 1. funkcja istnienieCykluEulera otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły dwukropek.
Linia 2. stopnieWierzchołków ← utwórz pustą tablicę.
Linia 3. stopnieWierzchołków ← stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 4. liczbaNieparzystych ← 0.
Linia 6. dla stopień w stopnieWierzchołków wykonuj dwukropek.
Linia 7. jeżeli stopień mod 2 wykrzyknik znak równości 0 dwukropek.
Linia 8. liczbaNieparzystych ← liczbaNieparzystych plus 1.
Linia 10. jeżeli liczbaNieparzystych znak równości 0 dwukropek.
Linia 11. wypisz cudzysłów Graf zawiera cykl Eulera kropka cudzysłów.
Linia 12. w przeciwnym razie dwukropek.
Linia 13. wypisz cudzysłów Graf nie zawiera cyklu Eulera kropka cudzysłów.
funkcja istnienieCykluEulera(macierzSąsiedztwa):
stopnieWierzchołków ← utwórz pustą tablicę
stopnieWierzchołków ← stopnieWierzchołkówWGrafie(macierzSąsiedztwa)
liczbaNieparzystych ← 0
dla stopień w stopnieWierzchołków wykonuj:
jeżeli stopień mod 2 != 0:
liczbaNieparzystych ← liczbaNieparzystych + 1
jeżeli liczbaNieparzystych = 0:
wypisz "Graf zawiera cykl Eulera."
w przeciwnym razie:
wypisz "Graf nie zawiera cyklu Eulera."
Kompletny algorytm:
Linia 1. funkcja stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa przecinek stopnieWierzchołków zamknij nawias okrągły dwukropek.
Linia 2. n ← długość otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 3. stopnieWierzchołków ← otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 5. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 6. jeżeli macierzSąsiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 7. stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy ← stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy plus 1.
Linia 8. jeżeli i znak równości j dwukropek.
Linia 9. stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy ← stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy plus 1.
Linia 11. zwróć stopnieWierzchołków.
Linia 13. funkcja istnienieCykluEulera otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły dwukropek.
Linia 14. stopnieWierzchołków ← utwórz pustą tablicę.
Linia 15. stopnieWierzchołków ← stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 16. liczbaNieparzystych ← 0.
Linia 18. dla stopień w stopnieWierzchołków wykonuj dwukropek.
Linia 19. jeżeli stopień mod 2 wykrzyknik znak równości 0 dwukropek.
Linia 20. liczbaNieparzystych ← liczbaNieparzystych plus 1.
Linia 22. jeżeli liczbaNieparzystych znak równości 0 dwukropek.
Linia 23. wypisz cudzysłów Graf zawiera cykl Eulera kropka cudzysłów.
Linia 24. w przeciwnym razie dwukropek.
Linia 25. wypisz cudzysłów Graf nie zawiera cyklu Eulera kropka cudzysłów.
funkcja stopnieWierzchołkówWGrafie(macierzSąsiedztwa, stopnieWierzchołków):
n ← długość(macierzSąsiedztwa)
stopnieWierzchołków ← [0] * n
dla i = 0, 1, ..., n - 1 wykonuj:
dla j = 0, 1, ..., n - 1 wykonuj:
jeżeli macierzSąsiedztwa[i][j] != 0:
stopnieWierzchołków[i] ← stopnieWierzchołków[i] + 1
jeżeli i = j:
stopnieWierzchołków[i] ← stopnieWierzchołków[i] + 1
zwróć stopnieWierzchołków
funkcja istnienieCykluEulera(macierzSąsiedztwa):
stopnieWierzchołków ← utwórz pustą tablicę
stopnieWierzchołków ← stopnieWierzchołkówWGrafie(macierzSąsiedztwa)
liczbaNieparzystych ← 0
dla stopień w stopnieWierzchołków wykonuj:
jeżeli stopień mod 2 != 0:
liczbaNieparzystych ← liczbaNieparzystych + 1
jeżeli liczbaNieparzystych = 0:
wypisz "Graf zawiera cykl Eulera."
w przeciwnym razie:
wypisz "Graf nie zawiera cyklu Eulera."
Polecenie 1
Przeanalizuj działanie programu dla zaprezentowanego grafu.
Dany jest następujący graf nieskierowany bez wag:
R1MbTs8xXp1kN
Ilustracja przedstawia graf składający się z dwóch nieregularnych czworokątów. Pierwszy z nich ma wierzchołki oznaczone jako 1, 2, 3 oraz 5, a drugi 1,6,3 oraz zero. Wierzchołki 1 oraz 3 są wierzchołkami wspólnymi. Dodatkowo na bok drugiego czworokąta pomiędzy punktem zero i trzy znajduje się punkt cztery. Punkty na wierzchołkach oznaczone są niebieskimi okręgami.
Graf spójny nieskierowany, który składa się z sześciu wierzchołków i dziewięciu krawędzi.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Macierz sąsiedztwa grafu:
Zastanów się, jaki będzie wynik działania programu. Spróbuj odnaleźć w grafie, jeśli jest, cykl Eulera.
Wynik działania programu:
Linia 1. Graf zawiera cykl Eulera kropka.
Graf zawiera cykl Eulera.
Przykładowy cykl Eulera:
Linia 1. 0 → 1 → 2 → 3 → 6 → 1 → 5 → 3 → 4 → 0.
0 → 1 → 2 → 3 → 6 → 1 → 5 → 3 → 4 → 0
Ścieżka Eulera
Przeanalizujmy teraz algorytm sprawdzania, czy w grafie można wyznaczyć ścieżkę Eulera. Jest to taka ścieżkaścieżkaścieżka, która przechodzi przez każdą krawędź grafu dokładnie raz i nie kończy się w wierzchołku, w którym się zaczynała.
Graf, który nie zawiera cyklu Eulera, a jedynie ścieżkę Eulera, nazywamy grafem półeulerowskim. Aby graf można było nazwać półeulerowskim, musi on spełniać warunek zawarty w poniższym twierdzeniu.
o istnieniu grafu półeulerowskiego
Twierdzenie: o istnieniu grafu półeulerowskiego
Graf spójny nazywamy grafem półeulerowskim wtedy i tylko wtedy, gdy zawiera on dokładnie dwa wierzchołki stopnia nieparzystego.
Na tej podstawie wcześniej przedstawiony algorytm można zmodyfikować tak, aby sprawdzał zarówno, czy graf jest eulerowski, jak i półeulerowski.
komunikat informujący o tym, czy graf jest eulerowski, półeulerowski lub czy nie jest ani eulerowski, ani półeulerowski
Dany jest następujący graf spójny nieskierowany bez wag:
RwNYxXmfzqT33
Spójny graf nieskierowany bez wag składający się z ośmiu wierzchołków oraz dziewięciu krawędzi. Wierzchołek jeden połączony jest krawędziami z wierzchołkami zero, dwa i trzy. Wierzchołek dwa z wierzchołkiem cztery. Wierzchołek trzy z wierzchołkami cztery i zero. Wierzchołek zero z wierzchołkiem siedem. Wierzchołek siedem łączy krawędź z wierzchołkiem sześć. Wierzchołek sześć połączony jest z wierzchołkiem pięć.
Graf spójny nieskierowany, który składa się z ośmiu wierzchołków i ośmiu krawędzi.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Macierz sąsiedztwa zaprezentowanego grafu:
Ponieważ nie wszystkie wierzchołki grafu są parzystego stopnia, graf nie jest grafem eulerowskim (nie zawiera cyklu Eulera). Natomiast dwa wierzchołki (1 oraz 5) są nieparzystego stopnia, zatem graf jest grafem półeulerowskim – zawiera zatem ścieżkę Eulera.
Ponownie wykorzystamy funkcję stopnieWierzchołkówWGrafie.
Zapiszmy nagłówek funkcji istnienieŚcieżkiEulera, która jako argument przyjmuje macierz sąsiedztwa macierzSąsiedztwa.
W kolejnym kroku tworzymy pustą tablicę stopnieWierzchołków.
Wywołujemy funkcję obliczającą stopnie wierzchołków stopnieWierzchołkówWGrafie. Wynik jej działania zapisujemy w utworzonej tablicy stopnieWierzchołków.
Następnie tworzymy i inicjalizujemy zmienną liczbaNieparzystych wartością 0. Zmienna będzie przechowywać liczbę wierzchołków o stopniu nieparzystym.
Linia 1. funkcja istnienieŚcieżkiEulera otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły dwukropek.
Linia 2. stopnieWierzchołków ← utwórz pustą tablicę.
Linia 3. stopnieWierzchołków ← stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 4. liczbaNieparzystych ← 0.
Zapisujemy pętlę, która będzie iterować po kolejnych wierzchołkach. Jej zadaniem będzie zliczenie wierzchołków o stopniu nieparzystym.
By to zrobić, zapisujemy instrukcję warunkową. Jeśli warunek jest spełniony, zwiększamy wartość zmiennej liczbaNieparzystych o 1.
Linia 1. funkcja istnienieŚcieżkiEulera otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły dwukropek.
Linia 2. stopnieWierzchołków ← utwórz pustą tablicę.
Linia 3. stopnieWierzchołków ← stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 4. liczbaNieparzystych ← 0.
Linia 6. dla stopień w stopnieWierzchołków wykonuj dwukropek.
Linia 7. jeżeli stopień mod 2 wykrzyknik znak równości 0 dwukropek.
Linia 8. liczbaNieparzystych ← liczbaNieparzystych plus 1.
funkcja istnienieŚcieżkiEulera(macierzSąsiedztwa):
stopnieWierzchołków ← utwórz pustą tablicę
stopnieWierzchołków ← stopnieWierzchołkówWGrafie(macierzSąsiedztwa)
liczbaNieparzystych ← 0
dla stopień w stopnieWierzchołków wykonuj:
jeżeli stopień mod 2 != 0:
liczbaNieparzystych ← liczbaNieparzystych + 1
Po zakończeniu pętli zostaje obliczona liczba wierzchołków o stopniu nieparzystym.
Zapisujemy instrukcje warunkowe, za pomocą których sprawdzimy odpowiednie własności grafu. W pierwszej sprawdzamy, czy wartość zmiennej liczbaNieparzystych wynosi 0.
Jeśli tak, oznacza to, że wszystkie wierzchołki mają stopień parzysty, a więc mamy do czynienia z grafem eulerowskim. Wypisujemy odpowiedni komunikat.
Jeśli wartość zmiennej liczbaNieparzystych wynosi 2, oznacza to, że dokładnie dwa wierzchołki mają stopień nieparzysty, co oznacza, że graf zawiera ścieżkę Eulera i jest grafem półeulerowskim. Wypisujemy odpowiedni komunikat.
W przeciwnym razie, gdy żaden z warunków nie jest spełniony, graf nie zawiera ani cyklu Eulera, ani ścieżki Eulera, zatem nie jest ani eulerowski, ani półeulerowski. Wypisujemy odpowiedni komunikat.
Kompletny algorytm:
Linia 1. funkcja stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa przecinek stopnieWierzchołków zamknij nawias okrągły dwukropek.
Linia 2. n ← długość otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 3. stopnieWierzchołków ← otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 5. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek n minus 1 wykonuj dwukropek.
Linia 6. jeżeli macierzSąsiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 7. stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy ← stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy plus 1.
Linia 8. jeżeli i znak równości j dwukropek.
Linia 9. stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy ← stopnieWierzchołków otwórz nawias kwadratowy i zamknij nawias kwadratowy plus 1.
Linia 11. zwróć stopnieWierzchołków.
Linia 13. funkcja istnienieŚcieżkiEulera otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły dwukropek.
Linia 14. stopnieWierzchołków ← utwórz pustą tablicę.
Linia 15. stopnieWierzchołków ← stopnieWierzchołkówWGrafie otwórz nawias okrągły macierzSąsiedztwa zamknij nawias okrągły.
Linia 16. liczbaNieparzystych ← 0.
Linia 18. dla stopień w stopnieWierzchołków wykonuj dwukropek.
Linia 19. jeżeli stopień mod 2 wykrzyknik znak równości 0 dwukropek.
Linia 20. liczbaNieparzystych ← liczbaNieparzystych plus 1.
Linia 22. jeżeli liczbaNieparzystych znak równości 0 dwukropek.
Linia 23. wypisz cudzysłów Graf jest eulerowski kropka cudzysłów.
Linia 24. w przeciwnym razie jeżli liczbaNieparzystych znak równości 2 dwukropek.
Linia 25. wypisz cudzysłów Graf jest półeulerowski kropka cudzysłów.
Linia 26. w przeciwnym razie dwukropek.
Linia 27. wypisz cudzysłów Graf nie jest ani eulerowski przecinek ani półeulerowski kropka cudzysłów.
funkcja stopnieWierzchołkówWGrafie(macierzSąsiedztwa, stopnieWierzchołków):
n ← długość(macierzSąsiedztwa)
stopnieWierzchołków ← [0] * n
dla i = 0, 1, ..., n - 1 wykonuj:
dla j = 0, 1, ..., n - 1 wykonuj:
jeżeli macierzSąsiedztwa[i][j] != 0:
stopnieWierzchołków[i] ← stopnieWierzchołków[i] + 1
jeżeli i = j:
stopnieWierzchołków[i] ← stopnieWierzchołków[i] + 1
zwróć stopnieWierzchołków
funkcja istnienieŚcieżkiEulera(macierzSąsiedztwa):
stopnieWierzchołków ← utwórz pustą tablicę
stopnieWierzchołków ← stopnieWierzchołkówWGrafie(macierzSąsiedztwa)
liczbaNieparzystych ← 0
dla stopień w stopnieWierzchołków wykonuj:
jeżeli stopień mod 2 != 0:
liczbaNieparzystych ← liczbaNieparzystych + 1
jeżeli liczbaNieparzystych = 0:
wypisz "Graf jest eulerowski."
w przeciwnym razie jeżli liczbaNieparzystych = 2:
wypisz "Graf jest półeulerowski."
w przeciwnym razie:
wypisz "Graf nie jest ani eulerowski, ani półeulerowski."
Słownik
cykl
cykl
ścieżka zamknięta, która zaczyna się i kończy w tym samym wierzchołku
graf
graf
struktura składająca się z niepustego zbioru wierzchołków oraz ze zbioru krawędzi; dla grafu zbiór wierzchołków oznaczamy (ang. verticies – wierzchołki), a zbiór krawędzi – (ang. edges – krawędzie); liczbę elementów zbioru oznaczamy literą , zaś liczbę elementów zbioru literą
multigraf
multigraf
graf, w którym możliwe jest połączenie dwóch wierzchołków za pomocą kilku krawędzi lub w którym występują krawędzie łączące wierzchołek sam ze sobą
ścieżka
ścieżka
trasa łącząca kolejne wierzchołki grafu, w której wszystkie krawędzie są różne