Zaczniemy od stopnia grafu – jest on równy maksymalnemu stopniowi wierzchołka w tym grafie.
Stopniem wierzchołka grafu nieskierowanego nazywamy liczbę krawędzikrawędźkrawędzi z nim incydentnych.
Ważne!
Jeśli w grafie nieskierowanym występuje krawędź, która jest pętlą, liczymy ją jako dwie krawędzie.
Stopniem wierzchołka grafu skierowanego nazywamy sumę dwóch liczb – liczby krawędzi do niego wchodzących (stopień wejściowy) oraz liczby krawędzi z niego wychodzących (stopień wyjściowy).
O grafie mówimy, że jest spójny, jeśli dla każdych dwóch jego wierzchołków istnieje ścieżka, która je ze sobą łączy.
Graf nieskierowany jest spójny, jeśli dla każdej pary wierzchołków istnieje ścieżka, która je łączy. Jeśli takiej ścieżki nie ma, wówczas taki graf określamy niespójnym.
O grafie skierowanym możemy powiedzieć, że jest grafem spójnym, jeśli po tym, jak wszystkie jego krawędzie skierowane zostaną zastąpione krawędziami nieskierowanymi, graf ten będzie grafem nieskierowanym spójnym,
Ważne!
Więcej na temat spójności grafu skierowanego znajdziesz w dalszej części e‑materiału w punkcie Digrafy.
Przykład 1
Zapoznaj się z przykładem grafu nieskierowanego, który nie jest spójny (składa się z trzech spójnych składowych).
R1F2Y4l34n02y
Niespójny graf o trzech spójnych składowych. 1: O połączeniach: A, C. B, C. A, C. 2: O połączeniach: F, E. E, D. F, D. 3: O połączeniach: G, H.
Niespójny graf o trzech spójnych składowych
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Spójny podgraf takiego grafu, który nie jest zawarty w żadnym większym spójnym podgrafie, nazywamy składową grafu. Możemy zauważyć, że każdy graf niespójny jest sumą pewnych spójnych grafów.
Przyjrzyjmy się grafom z Przykładu 1. Dane są trzy grafy spójne nieskierowane. Ich suma daje graf nieskierowany niespójny.
W kontekście spójności grafów definiujemy również pojęcie mostu, czyli krawędzi, której usunięcie sprawi, że graf zwiększy liczbę spójnych składowych o jeden.
R1VzXDO2cWEv9
Ilustracja przedstawia graf o połączeniach: C, A. A, B. C, B. Krawędź mostu: B, E. F, E. F, D. E, D. F, G. D, H. H, G. Drugi graf jest taki sam lecz nie posiada krawędzi mostu.
Lewy obrazek przedstawia graf składający się z jednej składowej. Po usunięciu krawędzi otrzymamy dwa spójne podgrafy (składowe). Krawędź ta jest zatem mostem.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Pojęcie mostu jest podstawą działania niektórych algorytmów grafowych, takich jak na przykład algorytm Fleury'ego służący do znajdowania w grafie ścieżki lub cyklu Eulera.
Przykład 2
Zaprezentowany graf to graf spójny, którego wierzchołki mają następujące stopnie:
stopień wierzchołka 0: 3
stopień wierzchołka 1: 2
stopień wierzchołka 2: 4
stopień wierzchołka 3: 2
stopień wierzchołka 4: 3
stopień wierzchołka 5: 2
Tym samym stopień grafu wynosi 4 (ponieważ tyle wynosi maksymalny stopień wierzchołka grafu).
RlfB6l1pznJKy
Ilustracja przedstawia cztery punkty oznaczone dużymi literami a, b, c, d. resztę odcinków oznaczono małymi literami, prostą bd oznaczono jako f, prostą cd oznaczono g, prostą ad oznaczono e. dwie krzywe ab oznaczono jako a i b, dwie krzywe ac oznaczono c i d, każda z dwóch krzywych jest skierowana w stronę prostej e a druga w przeciwną stronę.
Spójny graf nieskierowany, którego stopień grafu to 4 (ponieważ jest to największy stopień wierzchołka tego grafu).
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Już wiesz
Spójrzmy, jak wygląda graf przedstawiający mosty i lądy w Królewcu z czasów Eulera (by przypomnieć sobie, dlaczego przywołujemy mosty królewieckie w kontekście teorii grafów, przejdź do e‑materiału Zagadnienie mostów królewieckichPwWUgv9LEZagadnienie mostów królewieckich):
Rhc8uOvNVtNsd
Ilustracja przedstawia cztery punkty oznaczone dużymi literami a, b, c, d. resztę odcinków oznaczono małymi literami, prostą bd oznaczono jako f, prostą cd oznaczono g, prostą ad oznaczono e. dwie krzywe ab oznaczono jako a i b, dwie krzywe ac oznaczono c i d, każda z dwóch krzywych jest skierowana w stronę prostej e a druga w przeciwną stronę.
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.
W teorii grafów taka ścieżkaścieżkaścieżka zamknięta nazywana jest cyklem Eulera. O ścieżce mówimy, że jest zamknięta, jeśli wierzchołek początkowy jest tożsamy z jej wierzchołkiem końcowym.
Warunki istnienia cyklu Eulera w grafie określa następujące twierdzenie:
Spójny graf zawiera cykl Eulera wtedy i tylko wtedy, gdy każdy wierzchołek jest parzystego stopnia.
Warunkiem koniecznym istnienia cyklu Eulera jest spójność grafu. Gdyby graf nie był spójny, nie istniałaby możliwość odwiedzenia wszystkich jego wierzchołków w jednym cyklu.
Digrafy
Digraf (inaczej graf skierowany) to taki graf, w którym krawędzie mają ustalony kierunek z jednego wierzchołka do drugiego. Na rysunku zwykle jest to oznaczane strzałką w jednym z końców krawędzi. Formalnie powiemy, że grafem skierowanym (digrafem) nazywamy graf składający się z niepustego i skończonego zbioru wierzchołków oraz skończonej rodziny krawędzi , czyli z uporządkowanych par elementów zbioru .
Dla zaprezentowanego grafu zbiór wierzchołków to . Rodzina krawędzi to następujące pary: .
RUidT1OAFZJY1
Ilustracja przedstawia graf skierowany. D, E. D, C. E, C. C, B. A, B. A, D. D, A.
Spójny digraf (czyli graf skierowany)
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Jeśli i są wierzchołkami, to krawędź skierowana jest parą uporządkowaną i oznacza krawędź poprowadzoną z wierzchołka do wierzchołka . Jeśli w pewnym grafie istnieją krawędzie skierowane i , to nie są one krawędziami wielokrotnymi, ponieważ tutaj uwzględniamy kolejność wierzchołków.
Poruszanie się po krawędziach wychodzących
Stopniem wyjściowym wierzchołka digrafu nazywamy liczbę krawędzi skierowanych, wychodzących z wierzchołka . Stopień wyjściowy wierzchołka oznaczamy symbolem:
Analogicznie, stopniem wejściowym wierzchołka w digrafie będzie liczba krawędzi skierowanych, poprowadzonych do wierzchołka . Liczbę taką oznaczamy symbolem:
W digrafach możemy przechodzić przez krawędzie tylko w kierunku zgodnym z kolejnością wierzchołków krawędzi. Na przykład krawędź skierowaną można przejść tylko od do , natomiast odwrotne przejście jest niemożliwe.
Dla zaprezentowanego wyżej grafu stopień wejściowy wierzchołka to 1 (do wierzchołka skierowana jest tylko jedna krawędź), natomiast stopień wyjściowy wierzchołka to 2 (z wierzchołka wychodzą dwie krawędzie).
Spójność digrafów
Ponieważ w digrafach przechodzimy po danej krawędzi w ściśle określonym kierunku, może dojść do sytuacji, że z pewnego wierzchołka nie dostaniemy się do drugiego.
Rmw4TH9TChPk3
Ilustracja przedstawia graf skierowany o połączeniach: C, B. A, C. B, A. B, E. E, G. G, D. D, F. F, E. G, F. D, H. Okręgami z przerywanej linii zaznaczono węzły gdzie każdy jest dostępny z każdego wierzchołka.
Graf skierowany, który składa się z trzech silnie spójnych składowych (zaznaczonych przerywanymi liniami).
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Mówimy, że podgraf skierowany jest silnie spójną składową, jeśli każdy wierzchołek jest osiągalny z każdego innego wierzchołka składowej - czyli z każdego wierzchołka możemy poprowadzić ścieżkę do dowolnego wierzchołka.
Dla zaprezentowanego grafu możemy wyróżnić trzy podgrafy, które są silnie spójnymi składowymi. Otoczono je przerywanymi liniami.
Badanie stopnia wierzchołka grafu
Graf nieskierowany
Specyfikacja problemu:
Dane:
macierz_sasiedztwa – macierz sąsiedztwa grafu; lista dwuwymiarowa liczb naturalnych
Wynik:
wypisane stopnie poszczególnych wierzchołków
Dany jest następujący graf spójny nieskierowany bez wag:
R1OA3UoJEctUA
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.
Jego macierz sąsiedztwa:
R1eJLJbnGIkP5
Ilustracja przedstawia tabelkę sześć na sześć kratek. Jej kolumny i rzędy są oznaczone cyframi od 0 do 5. W pierwszym rzędzie wpisano 0, 1, 1, 0, 1, 0, w drugim rzędzie 1, 0, 1, 0, 1, 0, w trzecim rzędzie, 1, 1, 0, 1, 0, 1, w czwartym rzędzie 0, 0, 1, 0, 1, 0, w piątym rzędzie 1, 1, 0, 1, 0, 1, w szóstym rzędzie 0, 0, 1, 0, 1, 0.
Macierz sąsiedztwa zaprezentowanego grafu.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Implementacja zaprezentowanej macierzy sąsiedztwa w języku Python:
W kolejnym kroku tworzymy zmienną n przechowującą długość listy macierz_sasiedztwa (liczbę wierzchołków) oraz listę stopnie o długości równej liczbie wierzchołków grafu. Listę wypełniamy zerami. Będzie ona przechowywać stopnie kolejnych wierzchołków.
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
Zapisujemy pętlę for, która będzie iterować przez wszystkie wierzchołki (wiersze).
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
Zapisujemy zagnieżdżoną pętlę for, która będzie iterowała przez pozostałe wierzchołki grafu (kolumny w danym wierszu).
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
for j in range(n):
W pętli zapisujemy instrukcję warunkową, za pomocą której sprawdzimy, czy wierzchołki o danych indeksach są połączone krawędzią. Jeśli tak, zwiększamy stopień i-tego wierzchołka, czyli inkrementujemy wartość i-tego elementu listy stopnie.
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa 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. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
Dodajemy kolejną instrukcję warunkową, która obsłuży przypadek, w którym krawędź jest pętlą – wtedy liczymy ją podwójnie – ponownie inkrementujemy i-ty element listy stopnie.
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa 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. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 8. if i znak równości znak równości j dwukropek.
Linia 9. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
if i == j:
stopnie[i] += 1
Kompletny kod programu:
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa 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. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 8. if i znak równości znak równości j dwukropek.
Linia 9. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 11. print otwórz nawias okrągły cudzysłów Stopnie otwórz nawias okrągły graf nieskierowany zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły.
Linia 12. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 13. print otwórz nawias okrągły cudzysłów indeks wierzcholka dwukropek cudzysłów przecinek i przecinek cudzysłów stopien dwukropek cudzysłów przecinek stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 15. macierz podkreślnik sasiedztwa znak równości otwórz nawias kwadratowy.
Linia 16. otwórz nawias kwadratowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 17. otwórz nawias kwadratowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 18. otwórz nawias kwadratowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 19. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 20. otwórz nawias kwadratowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 21. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy.
Linia 22. zamknij nawias kwadratowy.
Linia 24. stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
if i == j:
stopnie[i] += 1
print("Stopnie (graf nieskierowany):")
for i in range(n):
print("indeks wierzcholka:", i, "stopien:", stopnie[i])
macierz_sasiedztwa = [
[0, 1, 1, 0, 1, 0],
[1, 0, 1, 0, 1, 0],
[1, 1, 0, 1, 0, 1],
[0, 0, 1, 0, 1, 0],
[1, 1, 0, 1, 0, 1],
[0, 0, 1, 0, 1, 0]
]
stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa)
Wynik działania programu:
Linia 1. Stopnie otwórz nawias okrągły nieskierowany zamknij nawias okrągły dwukropek.
Linia 2. indeks wierzcholka dwukropek 0 stopien dwukropek 3.
Linia 3. indeks wierzcholka dwukropek 1 stopien dwukropek 3.
Linia 4. indeks wierzcholka dwukropek 2 stopien dwukropek 4.
Linia 5. indeks wierzcholka dwukropek 3 stopien dwukropek 2.
Linia 6. indeks wierzcholka dwukropek 4 stopien dwukropek 4.
Linia 7. indeks wierzcholka dwukropek 5 stopien dwukropek 2.
macierz_sasiedztwa – macierz sąsiedztwa grafu; lista dwuwymiarowa liczb naturalnych
Wynik:
wypisane stopnie poszczególnych wierzchołków (sumy stopni wierzchołków wejściowych i wyjściowych)
Dany jest następujący graf spójny skierowany bez wag:
R51LJ4e2RonN5
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 strzałką, tak samo jak wierzchołek 2 i 0. Z 2 wychodzi strzałka, która prowadzi do punktu oznaczonego 3, który znajduje się wewnątrz figury. Od punktu 3 do punktu 4 również prowadzi strzałka. Wszystkie wierzchołki i punkty są oznaczone niebieskimi kółkami. Od punktu 0 do punktu 4 prowadzi strzałka oznaczona e2, od punktu 0 do punktu 1 prowadzi strzałka oznaczona e0, od punktu 0 do punktu 2 prowadzi strzałka oznaczona e2. Od punktu 1 do punktu 2 prowadzi strzałka oznaczona e3, od punktu 1 do punktu 4 prowadzi strzałka oznaczona e4. Od punktu 2 do punktu 3 prowadzi strzałka oznaczona e5, od punktu 2 do punktu 5 prowadzi strzałka oznaczona e6. Od punktu 3 do punktu 4 prowadzi strzałka oznaczona e7, punkty 4 i 5 łączy strzałka grotami na obu jej końcach oznaczona e8 i e9.
Spójny graf skierowany, którego stopień grafu wynosi 5, ponieważ tyle wynosi największy stopień spośród stopni wierzchołków tego grafu (po zsumowaniu stopni wejściowych oraz wyjściowych dla każdego wierzchołka).
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 2.0.
Macierz sąsiedztwa grafu:
R12LrCWhJbLTN
Ilustracja przedstawia tabelkę sześć na sześć kratek. Jej kolumny i rzędy są oznaczone cyframi od 0 do 5. W pierwszym rzędzie wpisano 0, 1, 1, 0, 1, 0, w drugim rzędzie 1, 0, 1, 0, 1, 0, w trzecim rzędzie, 1, 1, 0, 1, 0, 1, w czwartym rzędzie 0, 0, 1, 0, 1, 0, w piątym rzędzie 1, 1, 0, 1, 0, 1, w szóstym rzędzie 0, 0, 1, 0, 1, 0.
Macierz sąsiedztwa zaprezentowanego grafu.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Implementacja zaprezentowanej macierzy sąsiedztwa w języku Python:
Zapiszmy funkcję odpowiedzialną za określenie stopni poszczególnych wierzchołków. W przypadku tej implementacji nie będziemy rozróżniać stopni wejściowych oraz wyjściowych. Stopień wierzchołka będzie równy sumie stopni wejściowych i wyjściowych wierzchołka.
W przypadku prezentowanego programu będziemy obliczać sumę stopni wejściowych oraz wyjściowych dla każdego wierzchołka.
Zaczniemy od zapisania nagłówka funkcji. Funkcja przyjmuje jeden argument – macierz sąsiedztwa.
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Zmiennej n przypisujemy wartość równą liczbie wierzchołków.
W kolejnym kroku tworzymy listę stopnie o długości równej n. Listę wypełniamy zerami. Będzie ona przechowywać stopnie kolejnych wierzchołków.
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
Zapisujemy pętlę for, która będzie iterować przez wszystkie wierzchołki (wiersze).
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
Zapisujemy zagnieżdżoną pętlę for, która będzie iterowała przez pozostałe wierzchołki grafu (kolumny w danym wierszu) – w pętli sprawdzimy, czy istnieje krawędź między wierzchołkiem o indeksie i a j.
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
W pętli zapisujemy zatem instrukcję warunkową, za pomocą której sprawdzimy, czy wierzchołki o danych indeksach (i oraz j) są połączone krawędzią. Jeśli tak, zwiększamy stopnie i-tego (ponieważ ma on krawędź wychodzącą) oraz j-tego wierzchołka (ponieważ ma on krawędź wchodzącą), czyli inkrementujemy wartości i-tego oraz j‑tego elementu listy stopnie.
Stopień wierzchołka w grafie skierowanym definiujemy w tym przypadku jako sumę krawędzi wchodzących do wierzchołka i wychodzących z wierzchołka.
Zatem jeśli istnieje krawędź między wierzchołkami i oraz j, to dla wierzchołka i jest to krawędź wyjściowa, a dla wierzchołka j – wejściowa.
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa 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. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 8. stopnie otwórz nawias kwadratowy j zamknij nawias kwadratowy plus znak równości 1.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
stopnie[j] += 1
Kompletny kod programu:
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa 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. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 8. stopnie otwórz nawias kwadratowy j zamknij nawias kwadratowy plus znak równości 1.
Linia 10. print otwórz nawias okrągły cudzysłów Stopnie otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły.
Linia 11. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 12. print otwórz nawias okrągły cudzysłów indeks wierzcholka dwukropek cudzysłów przecinek i przecinek cudzysłów stopien dwukropek cudzysłów przecinek stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 13. print otwórz nawias okrągły zamknij nawias okrągły.
Linia 15. macierz podkreślnik sasiedztwa znak równości otwórz nawias kwadratowy.
Linia 16. otwórz nawias kwadratowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 17. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 18. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 19. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 20. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 21. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy.
Linia 22. zamknij nawias kwadratowy.
Linia 24. stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie = [0] * n
for i in range(n):
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
stopnie[j] += 1
print("Stopnie (graf skierowany):")
for i in range(n):
print("indeks wierzcholka:", i, "stopien:", stopnie[i])
print()
macierz_sasiedztwa = [
[0, 1, 1, 0, 1, 0],
[0, 0, 1, 0, 1, 0],
[0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0]
]
stopnie_w_grafie_skierowanym(macierz_sasiedztwa)
Wynik działania programu:
Linia 1. Stopnie otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek.
Linia 2. indeks wierzcholka dwukropek 0 stopien dwukropek 3.
Linia 3. indeks wierzcholka dwukropek 1 stopien dwukropek 3.
Linia 4. indeks wierzcholka dwukropek 2 stopien dwukropek 4.
Linia 5. indeks wierzcholka dwukropek 3 stopien dwukropek 2.
Linia 6. indeks wierzcholka dwukropek 4 stopien dwukropek 5.
Linia 7. indeks wierzcholka dwukropek 5 stopien dwukropek 3.
Jeśli chcemy obliczać osobno stopnie wejściowe i wyjściowe, musimy zmodyfikować funkcję, by osobno obliczać liczbę obu stopni dla każdego wierzchołka. Potrzebne będą dwie listy – jedna przechowująca stopnie wyjściowe, druga – wejściowe.
Zmienimy również sposób inkrementowania zmiennych w instrukcji warunkowej oraz wypisywania wyników.
Kompletny kod programu wraz z wywołaniem funkcji:
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. stopnie podkreślnik wejsciowe znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 4. stopnie podkreślnik wyjsciowe znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 6. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 7. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 8. if macierz podkreślnik sasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 9. stopnie podkreślnik wyjsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 10. stopnie podkreślnik wejsciowe otwórz nawias kwadratowy j zamknij nawias kwadratowy plus znak równości 1.
Linia 12. print otwórz nawias okrągły cudzysłów Stopnie wejsciowe otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły.
Linia 13. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 14. print otwórz nawias okrągły cudzysłów indeks wierzcholka dwukropek cudzysłów przecinek i przecinek cudzysłów stopien dwukropek cudzysłów przecinek stopnie podkreślnik wejsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 15. print otwórz nawias okrągły zamknij nawias okrągły.
Linia 17. print otwórz nawias okrągły cudzysłów Stopnie wyjsciowe otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły.
Linia 18. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 19. print otwórz nawias okrągły cudzysłów indeks wierzcholka dwukropek cudzysłów przecinek i przecinek cudzysłów stopien dwukropek cudzysłów przecinek stopnie podkreślnik wyjsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.
Linia 20. print otwórz nawias okrągły zamknij nawias okrągły.
Linia 22. macierz podkreślnik sasiedztwa znak równości otwórz nawias kwadratowy.
Linia 23. otwórz nawias kwadratowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 24. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 25. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 26. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 27. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 28. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy.
Linia 29. zamknij nawias kwadratowy.
Linia 31. stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa):
n = len(macierz_sasiedztwa)
stopnie_wejsciowe = [0] * n
stopnie_wyjsciowe = [0] * n
for i in range(n):
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie_wyjsciowe[i] += 1
stopnie_wejsciowe[j] += 1
print("Stopnie wejsciowe (graf skierowany):")
for i in range(n):
print("indeks wierzcholka:", i, "stopien:", stopnie_wejsciowe[i])
print()
print("Stopnie wyjsciowe (graf skierowany):")
for i in range(n):
print("indeks wierzcholka:", i, "stopien:", stopnie_wyjsciowe[i])
print()
macierz_sasiedztwa = [
[0, 1, 1, 0, 1, 0],
[0, 0, 1, 0, 1, 0],
[0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0]
]
stopnie_w_grafie_skierowanym(macierz_sasiedztwa)
Efekt działania programu:
Linia 1. Stopnie wejsciowe otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek.
Linia 2. indeks wierzcholka dwukropek 0 stopien dwukropek 0.
Linia 3. indeks wierzcholka dwukropek 1 stopien dwukropek 1.
Linia 4. indeks wierzcholka dwukropek 2 stopien dwukropek 2.
Linia 5. indeks wierzcholka dwukropek 3 stopien dwukropek 1.
Linia 6. indeks wierzcholka dwukropek 4 stopien dwukropek 4.
Linia 7. indeks wierzcholka dwukropek 5 stopien dwukropek 2.
Linia 9. Stopnie wyjsciowe otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek.
Linia 10. indeks wierzcholka dwukropek 0 stopien dwukropek 3.
Linia 11. indeks wierzcholka dwukropek 1 stopien dwukropek 2.
Linia 12. indeks wierzcholka dwukropek 2 stopien dwukropek 2.
Linia 13. indeks wierzcholka dwukropek 3 stopien dwukropek 1.
Linia 14. indeks wierzcholka dwukropek 4 stopien dwukropek 1.
Linia 15. indeks wierzcholka dwukropek 5 stopien dwukropek 1.
macierz_sasiedztwa – macierz sąsiedztwa grafu; lista dwuwymiarowa liczb naturalnych
Wynik:
stopień grafu nieskierowanego
Dany jest następujący graf spójny nieskierowany bez wag:
R1OA3UoJEctUA
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 grafu:
R2qewExxGb7lq
Ilustracja przedstawia tabelkę sześć na sześć kratek. Jej kolumny i rzędy są oznaczone cyframi od 0 do 5. W pierwszym rzędzie wpisano 0, 1, 1, 0, 1, 0, w drugim rzędzie 1, 0, 1, 0, 1, 0, w trzecim rzędzie, 1, 1, 0, 1, 0, 1, w czwartym rzędzie 0, 0, 1, 0, 1, 0, w piątym rzędzie 1, 1, 0, 1, 0, 1, w szóstym rzędzie 0, 0, 1, 0, 1, 0.
Macierz sąsiedztwa zaprezentowanego grafu.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Implementacja zaprezentowanej macierzy sąsiedztwa w języku Python:
W programie wykorzystamy funkcję odpowiedzialną za określenie stopni poszczególnych wierzchołków – zmodyfikujemy ją nieco, by wykorzystać listę stopnie w dalszej części programu.
Zmodyfikowana funkcja:
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa przecinek stopnie zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 4. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa 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. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 8. if i znak równości znak równości j dwukropek.
Linia 9. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa, stopnie):
n = len(macierz_sasiedztwa)
for i in range(n):
stopnie[i] = 0
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
if i == j:
stopnie[i] += 1
Dodatkowo w programie wykorzystamy jeszcze funkcję odpowiedzialną za znalezienie największego stopnia wśród stopni wierzchołków.
Zapiszmy ją. Jako argument przekażemy do funkcji listę przechowującą stopnie kolejnych wierzchołków.
Następnie zapiszemy pętlę for, która będzie iterowała przez elementy listy stopnie, zaczynając od elementu o indeksie 1.
Linia 1. def znajdz podkreślnik maksymalny podkreślnik stopien otwórz nawias okrągły stopnie zamknij nawias okrągły dwukropek.
Linia 2. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.
Linia 3. for i in range otwórz nawias okrągły 1 przecinek len otwórz nawias okrągły stopnie zamknij nawias okrągły zamknij nawias okrągły dwukropek.
def znajdz_maksymalny_stopien(stopnie):
maksymalny_stopien = stopnie[0]
for i in range(1, len(stopnie)):
W pętli zapisujemy instrukcję warunkową. Wykorzystamy ją do sprawdzenia, czy aktualnie analizowany stopień wierzchołka jest większy od wartości przechowywanej w zmiennej maksymalnyStopien. Jeśli tak, zaktualizujemy wartość tej zmiennej, przypisując jej wartość analizowanego stopnia wierzchołka.
Po przeiterowaniu przez elementy listy stopnie funkcja zwraca wartość zmiennej maksymalnyStopien, czyli stopień grafu.
Linia 1. def znajdz podkreślnik maksymalny podkreślnik stopien otwórz nawias okrągły stopnie zamknij nawias okrągły dwukropek.
Linia 2. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.
Linia 3. for i in range otwórz nawias okrągły 1 przecinek len otwórz nawias okrągły stopnie zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 4. if stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalny podkreślnik stopien dwukropek.
Linia 5. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 6. return maksymalny podkreślnik stopien.
def znajdz_maksymalny_stopien(stopnie):
maksymalny_stopien = stopnie[0]
for i in range(1, len(stopnie)):
if stopnie[i] > maksymalny_stopien:
maksymalny_stopien = stopnie[i]
return maksymalny_stopien
Kompletny kod programu:
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa przecinek stopnie zamknij nawias okrągły dwukropek.
Linia 2. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 3. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 4. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0.
Linia 5. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 6. if macierz podkreślnik sasiedztwa 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. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 8. if i znak równości znak równości j dwukropek.
Linia 9. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 11. def znajdz podkreślnik maksymalny podkreślnik stopien otwórz nawias okrągły stopnie zamknij nawias okrągły dwukropek.
Linia 12. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.
Linia 13. for i in range otwórz nawias okrągły 1 przecinek len otwórz nawias okrągły stopnie zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 14. if stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalny podkreślnik stopien dwukropek.
Linia 15. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 16. return maksymalny podkreślnik stopien.
Linia 18. macierz podkreślnik sasiedztwa znak równości otwórz nawias kwadratowy.
Linia 19. otwórz nawias kwadratowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 20. otwórz nawias kwadratowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 21. otwórz nawias kwadratowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 22. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 23. otwórz nawias kwadratowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 24. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy.
Linia 25. zamknij nawias kwadratowy.
Linia 27. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 28. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 29. stopnie podkreślnik w podkreślnik grafie podkreślnik nieskierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa przecinek stopnie zamknij nawias okrągły.
Linia 30. maksymalny podkreślnik stopien znak równości znajdz podkreślnik maksymalny podkreślnik stopien otwórz nawias okrągły stopnie zamknij nawias okrągły.
Linia 31. print otwórz nawias okrągły cudzysłów Stopien grafu nieskierowanego dwukropek cudzysłów przecinek maksymalny podkreślnik stopien zamknij nawias okrągły.
def stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa, stopnie):
n = len(macierz_sasiedztwa)
for i in range(n):
stopnie[i] = 0
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
if i == j:
stopnie[i] += 1
def znajdz_maksymalny_stopien(stopnie):
maksymalny_stopien = stopnie[0]
for i in range(1, len(stopnie)):
if stopnie[i] > maksymalny_stopien:
maksymalny_stopien = stopnie[i]
return maksymalny_stopien
macierz_sasiedztwa = [
[0, 1, 1, 0, 1, 0],
[1, 0, 1, 0, 1, 0],
[1, 1, 0, 1, 0, 1],
[0, 0, 1, 0, 1, 0],
[1, 1, 0, 1, 0, 1],
[0, 0, 1, 0, 1, 0]
]
n = len(macierz_sasiedztwa)
stopnie = [0] * n
stopnie_w_grafie_nieskierowanym(macierz_sasiedztwa, stopnie)
maksymalny_stopien = znajdz_maksymalny_stopien(stopnie)
print("Stopien grafu nieskierowanego:", maksymalny_stopien)
Wynik działania programu:
Linia 1. Stopien grafu nieskierowanego dwukropek 4.
Stopien grafu nieskierowanego: 4
Graf skierowany
Specyfikacja problemu:
Dane:
macierz_sasiedztwa – macierz sąsiedztwa grafu; lista dwuwymiarowa liczb naturalnych
Wynik:
stopień grafu skierowanego
Dany jest następujący graf spójny skierowany bez wag:
R51LJ4e2RonN5
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 strzałką, tak samo jak wierzchołek 2 i 0. Z 2 wychodzi strzałka, która prowadzi do punktu oznaczonego 3, który znajduje się wewnątrz figury. Od punktu 3 do punktu 4 również prowadzi strzałka. Wszystkie wierzchołki i punkty są oznaczone niebieskimi kółkami. Od punktu 0 do punktu 4 prowadzi strzałka oznaczona e2, od punktu 0 do punktu 1 prowadzi strzałka oznaczona e0, od punktu 0 do punktu 2 prowadzi strzałka oznaczona e2. Od punktu 1 do punktu 2 prowadzi strzałka oznaczona e3, od punktu 1 do punktu 4 prowadzi strzałka oznaczona e4. Od punktu 2 do punktu 3 prowadzi strzałka oznaczona e5, od punktu 2 do punktu 5 prowadzi strzałka oznaczona e6. Od punktu 3 do punktu 4 prowadzi strzałka oznaczona e7, punkty 4 i 5 łączy strzałka grotami na obu jej końcach oznaczona e8 i e9.
Spójny graf skierowany, którego stopień grafu wynosi 5, ponieważ tyle wynosi największy stopień spośród stopni wierzchołków tego grafu (po zsumowaniu stopni wejściowych oraz wyjściowych dla każdego wierzchołka).
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 2.0.
Macierz sąsiedztwa grafu:
R12LrCWhJbLTN
Ilustracja przedstawia tabelkę sześć na sześć kratek. Jej kolumny i rzędy są oznaczone cyframi od 0 do 5. W pierwszym rzędzie wpisano 0, 1, 1, 0, 1, 0, w drugim rzędzie 1, 0, 1, 0, 1, 0, w trzecim rzędzie, 1, 1, 0, 1, 0, 1, w czwartym rzędzie 0, 0, 1, 0, 1, 0, w piątym rzędzie 1, 1, 0, 1, 0, 1, w szóstym rzędzie 0, 0, 1, 0, 1, 0.
Macierz sąsiedztwa zaprezentowanego grafu.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Implementacja zaprezentowanej macierzy sąsiedztwa w języku Python:
W programie ponownie wykorzystamy zmodyfikowaną funkcję odpowiedzialną za określenie stopni poszczególnych wierzchołków.
Funkcja:
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa przecinek stopnie zamknij nawias okrągły dwukropek.
Linia 2. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 3. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0.
Linia 4. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. if macierz podkreślnik sasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 6. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 7. if macierz podkreślnik sasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 8. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa, stopnie):
for i in range(n):
stopnie[i] = 0
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
if macierz_sasiedztwa[j][i] != 0:
stopnie[i] += 1
Funkcja odpowiedzialna za określenie największego stopnia wierzchołka jest taka sama, jak dla implementacji dla grafu nieskierowango:
Linia 1. def znajdz podkreślnik maksymalny podkreślnik stopien otwórz nawias okrągły stopnie zamknij nawias okrągły dwukropek.
Linia 2. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.
Linia 3. for i in range otwórz nawias okrągły 1 przecinek len otwórz nawias okrągły stopnie zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 4. if stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalny podkreślnik stopien dwukropek.
Linia 5. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 6. return maksymalny podkreślnik stopien.
def znajdz_maksymalny_stopien(stopnie):
maksymalny_stopien = stopnie[0]
for i in range(1, len(stopnie)):
if stopnie[i] > maksymalny_stopien:
maksymalny_stopien = stopnie[i]
return maksymalny_stopien
Kompletny kod programu:
Linia 1. def stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa przecinek stopnie zamknij nawias okrągły dwukropek.
Linia 2. for i in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 3. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0.
Linia 4. for j in range otwórz nawias okrągły n zamknij nawias okrągły dwukropek.
Linia 5. if macierz podkreślnik sasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 6. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 7. if macierz podkreślnik sasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości 0 dwukropek.
Linia 8. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości 1.
Linia 11. def znajdz podkreślnik maksymalny podkreślnik stopien otwórz nawias okrągły stopnie zamknij nawias okrągły dwukropek.
Linia 12. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.
Linia 13. for i in range otwórz nawias okrągły 1 przecinek len otwórz nawias okrągły stopnie zamknij nawias okrągły zamknij nawias okrągły dwukropek.
Linia 14. if stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalny podkreślnik stopien dwukropek.
Linia 15. maksymalny podkreślnik stopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy.
Linia 16. return maksymalny podkreślnik stopien.
Linia 18. macierz podkreślnik sasiedztwa znak równości otwórz nawias kwadratowy.
Linia 19. otwórz nawias kwadratowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 20. otwórz nawias kwadratowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 21. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 22. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy przecinek.
Linia 23. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias kwadratowy przecinek.
Linia 24. otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias kwadratowy.
Linia 25. zamknij nawias kwadratowy.
Linia 27. n znak równości len otwórz nawias okrągły macierz podkreślnik sasiedztwa zamknij nawias okrągły.
Linia 28. stopnie znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk n.
Linia 29. stopnie podkreślnik w podkreślnik grafie podkreślnik skierowanym otwórz nawias okrągły macierz podkreślnik sasiedztwa przecinek stopnie zamknij nawias okrągły.
Linia 30. maksymalny podkreślnik stopien znak równości znajdz podkreślnik maksymalny podkreślnik stopien otwórz nawias okrągły stopnie zamknij nawias okrągły.
Linia 31. print otwórz nawias okrągły cudzysłów Stopien grafu skierowanego dwukropek cudzysłów przecinek maksymalny podkreślnik stopien zamknij nawias okrągły.
def stopnie_w_grafie_skierowanym(macierz_sasiedztwa, stopnie):
for i in range(n):
stopnie[i] = 0
for j in range(n):
if macierz_sasiedztwa[i][j] != 0:
stopnie[i] += 1
if macierz_sasiedztwa[j][i] != 0:
stopnie[i] += 1
def znajdz_maksymalny_stopien(stopnie):
maksymalny_stopien = stopnie[0]
for i in range(1, len(stopnie)):
if stopnie[i] > maksymalny_stopien:
maksymalny_stopien = stopnie[i]
return maksymalny_stopien
macierz_sasiedztwa = [
[0, 1, 1, 0, 1, 0],
[0, 0, 1, 0, 1, 0],
[0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 1, 0]
]
n = len(macierz_sasiedztwa)
stopnie = [0] * n
stopnie_w_grafie_skierowanym(macierz_sasiedztwa, stopnie)
maksymalny_stopien = znajdz_maksymalny_stopien(stopnie)
print("Stopien grafu skierowanego:", maksymalny_stopien)
Wynik działania programu:
Linia 1. Stopien grafu skierowanego dwukropek 5.
Stopien grafu skierowanego: 5
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ą
graf spójny
graf spójny
graf, w którym każda para wierzchołków połączona jest ścieżką
krawędź
krawędź
nieuporządkowana para (niekoniecznie różnych) elementów zbioru wierzchołków, tj. takich, które są ze sobą połączone; w reprezentacji graficznej jest to linia łącząca te wierzchołki; krawędź może łączyć ze sobą jeden wierzchołek (wtedy nazywana jest pętlą)
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ą
stopień wierzchołka
stopień wierzchołka
liczba krawędzi incydentnych z danym wierzchołkiem
ścieżka
ścieżka
trasa łącząca kolejne wierzchołki grafu, w której wszystkie krawędzie są różne
wierzchołek
wierzchołek
inaczej: punkt, węzeł; element niepustego zbioru, który wraz ze zbiorem krawędzi tworzy graf