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:
n – stała przechowująca liczbę wierzchołków grafu; liczba naturalna
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 C++:
Linia 1. const int n znak równości 6 średnik.
Linia 3. 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 4. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 5. otwórz nawias klamrowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 6. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 7. otwórz nawias klamrowy 0 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.
Linia 10. zamknij nawias klamrowy średnik.
Tworzymy również stałą n, która będzie przechowywać liczbę wierzchołków grafu.
Zapiszmy funkcję odpowiedzialną za określenie stopni poszczególnych wierzchołków.
Zaczniemy od zapisania nagłówka funkcji. Funkcja przyjmuje jeden argument – macierz sąsiedztwa grafu.
Linia 1. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. zamknij nawias klamrowy.
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
}
W kolejnym kroku tworzymy tablicę stopnie o długości równej liczbie wierzchołków grafu. Tablicę wypełniamy zerami. Będzie ona przechowywać stopnie kolejnych wierzchołków.
Linia 1. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 4. zamknij nawias klamrowy.
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
int stopnie[n] = {0};
}
Zapisujemy pętlę for, która będzie iterować przez wszystkie wierzchołki (wiersze).
Linia 1. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. zamknij nawias klamrowy.
Linia 5. zamknij nawias klamrowy.
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
}
}
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. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. zamknij nawias klamrowy.
Linia 7. zamknij nawias klamrowy.
Linia 8. zamknij nawias klamrowy.
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
}
}
}
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 tablicy stopnie.
Linia 1. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 8. zamknij nawias klamrowy.
Linia 9. zamknij nawias klamrowy.
Linia 10. zamknij nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
}
}
}
}
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 tablicy stopnie.
Linia 1. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 7. if otwórz nawias okrągły i znak równości znak równości j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 8. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 9. zamknij nawias klamrowy.
Linia 10. zamknij nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
Linia 13. zamknij nawias klamrowy.
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
if (i == j) {
stopnie[i]++;
}
}
}
}
}
Dodajemy niezbędną bibliotekę, przestrzeń nazw, a także wywołanie funkcji.
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. using namespace std średnik.
Linia 4. const int n znak równości 6 średnik.
Linia 6. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 8. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 12. if otwórz nawias okrągły i znak równości znak równości j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 14. zamknij nawias klamrowy.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 17. zamknij nawias klamrowy.
Linia 19. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopnie otwórz nawias okrągły graf nieskierowany zamknij nawias okrągły dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
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 plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 21. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów indeks wierzcholka dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów stopien dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 22. zamknij nawias klamrowy.
Linia 23. zamknij nawias klamrowy.
Linia 25. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 26. 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 27. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 28. otwórz nawias klamrowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 29. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 30. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 31. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 32. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy.
Linia 33. zamknij nawias klamrowy średnik.
Linia 35. stopnieWGrafieNieskierowanym otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik.
Linia 37. return 0 średnik.
Linia 38. zamknij nawias klamrowy.
#include <iostream>
using namespace std;
const int n = 6;
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
if (i == j) {
stopnie[i]++;
}
}
}
}
cout << "Stopnie (graf nieskierowany): " << endl;
for (int i = 0; i < n; ++i) {
cout << "indeks wierzcholka: " << i << " stopien: " << stopnie[i] << endl;
}
}
int main() {
int macierzSasiedztwa[n][n] = {
{ 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 }
};
stopnieWGrafieNieskierowanym(macierzSasiedztwa);
return 0;
}
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.
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 C++:
Linia 1. const int n znak równości 6 średnik.
Linia 3. 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 4. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 5. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 6. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 7. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 8. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 9. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy.
Linia 10. zamknij nawias klamrowy średnik.
Ponownie tworzymy stałą n odpowiedzialną za przechowywanie liczby wierzchołków grafu.
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. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. zamknij nawias klamrowy.
W kolejnym kroku tworzymy tablicę stopnie o długości równej liczbie wierzchołków grafu. Tablicę wypełniamy zerami. Będzie ona przechowywać stopnie kolejnych wierzchołków.
Linia 1. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 4. zamknij nawias klamrowy.
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n]) {
int stopnie[n] = {0};
}
Zapisujemy pętlę for, która będzie iterować przez wszystkie wierzchołki (wiersze).
Linia 1. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. zamknij nawias klamrowy.
Linia 5. zamknij nawias klamrowy.
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
}
}
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. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. zamknij nawias klamrowy.
Linia 7. zamknij nawias klamrowy.
Linia 8. zamknij nawias klamrowy.
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
}
}
}
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 tablicy 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. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 7. stopnie otwórz nawias kwadratowy j zamknij nawias kwadratowy plus plus średnik.
Linia 8. zamknij nawias klamrowy.
Linia 9. zamknij nawias klamrowy.
Linia 10. zamknij nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
stopnie[j]++;
}
}
}
}
Dodajemy niezbędną bibliotekę, przestrzeń nazw, a także wywołanie funkcji.
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. using namespace std średnik.
Linia 4. const int n znak równości 6 średnik.
Linia 6. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 9. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 13. stopnie otwórz nawias kwadratowy j zamknij nawias kwadratowy plus plus średnik.
Linia 14. zamknij nawias klamrowy.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 18. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopnie otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 19. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 20. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów indeks wierzcholka dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów stopien dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 21. zamknij nawias klamrowy.
Linia 22. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 23. zamknij nawias klamrowy.
Linia 25. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 26. 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 27. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 28. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 29. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 30. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 31. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 32. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy.
Linia 33. zamknij nawias klamrowy średnik.
Linia 35. stopnieWGrafieSkierowanym otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik.
Linia 37. return 0 średnik.
Linia 38. zamknij nawias klamrowy.
#include <iostream>
using namespace std;
const int n = 6;
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n]) {
int stopnie[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
stopnie[j]++;
}
}
}
cout << "Stopnie (graf skierowany): " << endl;
for (int i = 0; i < n; ++i) {
cout << "indeks wierzcholka: " << i << " stopien: " << stopnie[i] << endl;
}
cout << endl;
}
int main() {
int macierzSasiedztwa[n][n] = {
{ 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 }
};
stopnieWGrafieSkierowanym(macierzSasiedztwa);
return 0;
}
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 tablice – jedna przechowująca stopnie wyjściowe, druga – wejściowe.
Zmienimy również sposób inkrementowania zmiennych w instrukcji warunkowej oraz wypisywania wyników.
Linia 1. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int stopnieWejsciowe otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 3. int stopnieWyjsciowe otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 5. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 8. stopnieWyjsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 9. stopnieWejsciowe otwórz nawias kwadratowy j zamknij nawias kwadratowy plus plus średnik.
Linia 10. zamknij nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
Linia 14. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopnie wejsciowe otwórz nawias okrągły skierowany zamknij nawias okrągły dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 15. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 16. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów indeks wierzcholka dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów stopien dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny stopnieWejsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 17. zamknij nawias klamrowy.
Linia 18. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 20. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopnie wyjsciowe otwórz nawias okrągły skierowany zamknij nawias okrągły dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
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 plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 22. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów indeks wierzcholka dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów stopien dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny stopnieWyjsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 23. zamknij nawias klamrowy.
Linia 24. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 25. zamknij nawias klamrowy.
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n]) {
int stopnieWejsciowe[n] = {0};
int stopnieWyjsciowe[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnieWyjsciowe[i]++;
stopnieWejsciowe[j]++;
}
}
}
cout << "Stopnie wejsciowe (skierowany): " << endl;
for (int i = 0; i < n; ++i) {
cout << "indeks wierzcholka: " << i << " stopien: " << stopnieWejsciowe[i] << endl;
}
cout << endl;
cout << "Stopnie wyjsciowe (skierowany): " << endl;
for (int i = 0; i < n; ++i) {
cout << "indeks wierzcholka: " << i << " stopien: " << stopnieWyjsciowe[i] << endl;
}
cout << endl;
}
Kompletny kod programu wraz z wywołaniem funkcji:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. using namespace std średnik.
Linia 4. const int n znak równości 6 średnik.
Linia 6. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. int stopnieWejsciowe otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 8. int stopnieWyjsciowe otwórz nawias kwadratowy n zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 0 zamknij nawias klamrowy średnik.
Linia 10. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 12. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. stopnieWyjsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 14. stopnieWejsciowe otwórz nawias kwadratowy j zamknij nawias kwadratowy plus plus średnik.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 17. zamknij nawias klamrowy.
Linia 19. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopnie wejsciowe otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
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 plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 21. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów indeks wierzcholka dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów stopien dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny stopnieWejsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 22. zamknij nawias klamrowy.
Linia 23. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 25. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopnie wyjsciowe otwórz nawias okrągły graf skierowany zamknij nawias okrągły dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 26. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 27. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów indeks wierzcholka dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny i otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów stopien dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny stopnieWyjsciowe otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 28. zamknij nawias klamrowy.
Linia 29. cout otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
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. 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 34. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 35. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 36. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 37. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 38. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 39. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy.
Linia 40. zamknij nawias klamrowy średnik.
Linia 42. stopnieWGrafieSkierowanym otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik.
Linia 44. return 0 średnik.
Linia 45. zamknij nawias klamrowy.
#include <iostream>
using namespace std;
const int n = 6;
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n]) {
int stopnieWejsciowe[n] = {0};
int stopnieWyjsciowe[n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnieWyjsciowe[i]++;
stopnieWejsciowe[j]++;
}
}
}
cout << "Stopnie wejsciowe (graf skierowany): " << endl;
for (int i = 0; i < n; ++i) {
cout << "indeks wierzcholka: " << i << " stopien: " << stopnieWejsciowe[i] << endl;
}
cout << endl;
cout << "Stopnie wyjsciowe (graf skierowany): " << endl;
for (int i = 0; i < n; ++i) {
cout << "indeks wierzcholka: " << i << " stopien: " << stopnieWyjsciowe[i] << endl;
}
cout << endl;
}
int main() {
int macierzSasiedztwa[n][n] = {
{ 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 }
};
stopnieWGrafieSkierowanym(macierzSasiedztwa);
return 0;
}
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.
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 C++:
Linia 1. const int n znak równości 6 średnik.
Linia 3. 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 4. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 5. otwórz nawias klamrowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 6. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 7. otwórz nawias klamrowy 0 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.
Linia 10. zamknij nawias klamrowy średnik.
Tworzymy również stałą n, która będzie przechowywać liczbę wierzchołków grafu.
W programie wykorzystamy funkcję odpowiedzialną za określenie stopni poszczególnych wierzchołków – zmodyfikujemy ją nieco, by wykorzystać tablicę stopnie w dalszej części programu.
Zmodyfikowana funkcja:
Linia 1. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy 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 plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0 średnik.
Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 7. if otwórz nawias okrągły i znak równości znak równości j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 8. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 9. zamknij nawias klamrowy.
Linia 10. zamknij nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
Linia 13. zamknij nawias klamrowy.
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
for (int i = 0; i < n; ++i) {
stopnie[i] = 0;
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
if (i == j) {
stopnie[i]++;
}
}
}
}
}
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 tablicę przechowującą stopnie kolejnych wierzchołków.
Nagłówek funkcji:
Linia 1. int znajdzMaksymalnyStopien otwórz nawias okrągły int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. zamknij nawias klamrowy.
int znajdzMaksymalnyStopien(int stopnie[n]) {
}
Zaczniemy od utworzenia zmiennej maksymalnyStopien. Przypiszemy jej pierwszy element tablicy stopnie (element o indeksie 0).
Linia 1. int znajdzMaksymalnyStopien otwórz nawias okrągły int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.
Linia 4. zamknij nawias klamrowy.
int znajdzMaksymalnyStopien(int stopnie[n]) {
int maksymalnyStopien = stopnie[0];
}
Następnie zapiszemy pętlę for, która będzie iterowała przez elementy tablicy stopnie, zaczynając od elementu o indeksie 1.
Linia 1. int znajdzMaksymalnyStopien otwórz nawias okrągły int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. zamknij nawias klamrowy.
Linia 6. zamknij nawias klamrowy.
int znajdzMaksymalnyStopien(int stopnie[n]) {
int maksymalnyStopien = stopnie[0];
for (int i = 1; i < n; ++i) {
}
}
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 tablicy stopnie funkcja zwraca wartość zmiennej maksymalnyStopien, czyli stopień grafu.
Linia 1. int znajdzMaksymalnyStopien otwórz nawias okrągły int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. if otwórz nawias okrągły stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalnyStopien zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik.
Linia 6. zamknij nawias klamrowy.
Linia 7. zamknij nawias klamrowy.
Linia 8. return maksymalnyStopien średnik.
Linia 9. zamknij nawias klamrowy.
int znajdzMaksymalnyStopien(int stopnie[n]) {
int maksymalnyStopien = stopnie[0];
for (int i = 1; i < n; ++i) {
if (stopnie[i] > maksymalnyStopien) {
maksymalnyStopien = stopnie[i];
}
}
return maksymalnyStopien;
}
Dodajemy niezbędną bibliotekę, przestrzeń nazw, a także wywołania funkcji oraz wypisywanie odpowiedniego komunikatu.
Kompletny kod programu:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. using namespace std średnik.
Linia 4. const int n znak równości 6 średnik.
Linia 6. void stopnieWGrafieNieskierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 8. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0 średnik.
Linia 9. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 12. if otwórz nawias okrągły i znak równości znak równości j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 13. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 14. zamknij nawias klamrowy.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 17. zamknij nawias klamrowy.
Linia 18. zamknij nawias klamrowy.
Linia 20. int znajdzMaksymalnyStopien otwórz nawias okrągły int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 21. int maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.
Linia 22. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 23. if otwórz nawias okrągły stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalnyStopien zamknij nawias okrągły otwórz nawias klamrowy.
Linia 24. maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik.
Linia 25. zamknij nawias klamrowy.
Linia 26. zamknij nawias klamrowy.
Linia 27. return maksymalnyStopien średnik.
Linia 28. zamknij nawias klamrowy.
Linia 30. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 31. 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 32. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 33. otwórz nawias klamrowy 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 34. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 35. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 36. otwórz nawias klamrowy 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 37. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy.
Linia 38. zamknij nawias klamrowy średnik.
Linia 40. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy średnik.
Linia 41. stopnieWGrafieNieskierowanym otwórz nawias okrągły macierzSasiedztwa przecinek stopnie zamknij nawias okrągły średnik.
Linia 42. int maksymalnyStopien znak równości znajdzMaksymalnyStopien otwórz nawias okrągły stopnie zamknij nawias okrągły średnik.
Linia 43. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopien grafu nieskierowanego dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny maksymalnyStopien otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 45. return 0 średnik.
Linia 46. zamknij nawias klamrowy.
#include <iostream>
using namespace std;
const int n = 6;
void stopnieWGrafieNieskierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
for (int i = 0; i < n; ++i) {
stopnie[i] = 0;
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
if (i == j) {
stopnie[i]++;
}
}
}
}
}
int znajdzMaksymalnyStopien(int stopnie[n]) {
int maksymalnyStopien = stopnie[0];
for (int i = 1; i < n; ++i) {
if (stopnie[i] > maksymalnyStopien) {
maksymalnyStopien = stopnie[i];
}
}
return maksymalnyStopien;
}
int main() {
int macierzSasiedztwa[n][n] = {
{ 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 }
};
int stopnie[n];
stopnieWGrafieNieskierowanym(macierzSasiedztwa, stopnie);
int maksymalnyStopien = znajdzMaksymalnyStopien(stopnie);
cout << "Stopien grafu nieskierowanego: " << maksymalnyStopien << endl;
return 0;
}
Wynik działania programu:
Linia 1. Stopien grafu nieskierowanego dwukropek 4.
Stopien grafu nieskierowanego: 4
Graf skierowany
Specyfikacja problemu:
Dane:
n – stała przechowująca liczbę wierzchołków grafu; liczba naturalna
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 C++:
Linia 1. const int n znak równości 6 średnik.
Linia 3. 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 4. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 5. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 6. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 7. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 8. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 9. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy.
Linia 10. zamknij nawias klamrowy średnik.
W tym przypadku również tworzymy stałą n, która będzie przechowywać liczbę wierzchołków grafu.
W programie ponownie wykorzystamy zmodyfikowaną funkcję odpowiedzialną za określenie stopni poszczególnych wierzchołków.
Funkcja:
Linia 1. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy 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 plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 3. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0 średnik.
Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 6. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 7. zamknij nawias klamrowy.
Linia 8. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 9. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 10. zamknij nawias klamrowy.
Linia 11. zamknij nawias klamrowy.
Linia 12. zamknij nawias klamrowy.
Linia 13. zamknij nawias klamrowy.
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
for (int i = 0; i < n; ++i) {
stopnie[i] = 0;
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
}
if (macierzSasiedztwa[j][i] != 0) {
stopnie[i]++;
}
}
}
}
Funkcja odpowiedzialna za określenie największego stopnia wierzchołka jest taka sama, jak dla implementacji dla grafu nieskierowango:
Linia 1. int znajdzMaksymalnyStopien otwórz nawias okrągły int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 2. int maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.
Linia 3. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 4. if otwórz nawias okrągły stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalnyStopien zamknij nawias okrągły otwórz nawias klamrowy.
Linia 5. maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik.
Linia 6. zamknij nawias klamrowy.
Linia 7. zamknij nawias klamrowy.
Linia 8. return maksymalnyStopien średnik.
Linia 9. zamknij nawias klamrowy.
int znajdzMaksymalnyStopien(int stopnie[n]) {
int maksymalnyStopien = stopnie[0];
for (int i = 1; i < n; ++i) {
if (stopnie[i] > maksymalnyStopien) {
maksymalnyStopien = stopnie[i];
}
}
return maksymalnyStopien;
}
Dodajemy niezbędną bibliotekę, przestrzeń nazw, a także wywołanie funkcji.
Kompletny kod programu:
Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny.
Linia 2. using namespace std średnik.
Linia 4. const int n znak równości 6 średnik.
Linia 6. void stopnieWGrafieSkierowanym otwórz nawias okrągły int macierzSasiedztwa otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy przecinek int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 7. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 8. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0 średnik.
Linia 9. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n średnik plus plus j zamknij nawias okrągły otwórz nawias klamrowy.
Linia 10. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 11. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 12. zamknij nawias klamrowy.
Linia 13. if otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy.
Linia 14. stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy plus plus średnik.
Linia 15. zamknij nawias klamrowy.
Linia 16. zamknij nawias klamrowy.
Linia 17. zamknij nawias klamrowy.
Linia 18. zamknij nawias klamrowy.
Linia 20. int znajdzMaksymalnyStopien otwórz nawias okrągły int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy.
Linia 21. int maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.
Linia 22. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy.
Linia 23. if otwórz nawias okrągły stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maksymalnyStopien zamknij nawias okrągły otwórz nawias klamrowy.
Linia 24. maksymalnyStopien znak równości stopnie otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik.
Linia 25. zamknij nawias klamrowy.
Linia 26. zamknij nawias klamrowy.
Linia 27. return maksymalnyStopien średnik.
Linia 28. zamknij nawias klamrowy.
Linia 30. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy.
Linia 31. 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 32. otwórz nawias klamrowy 0 przecinek 1 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 33. otwórz nawias klamrowy 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 34. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 35. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy przecinek.
Linia 36. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 zamknij nawias klamrowy przecinek.
Linia 37. otwórz nawias klamrowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 1 przecinek 0 zamknij nawias klamrowy.
Linia 38. zamknij nawias klamrowy średnik.
Linia 40. int stopnie otwórz nawias kwadratowy n zamknij nawias kwadratowy średnik.
Linia 41. stopnieWGrafieSkierowanym otwórz nawias okrągły macierzSasiedztwa przecinek stopnie zamknij nawias okrągły średnik.
Linia 42. int maksymalnyStopien znak równości znajdzMaksymalnyStopien otwórz nawias okrągły stopnie zamknij nawias okrągły średnik.
Linia 43. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Stopien grafu skierowanego dwukropek cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny maksymalnyStopien otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik.
Linia 45. return 0 średnik.
Linia 47. zamknij nawias klamrowy.
#include <iostream>
using namespace std;
const int n = 6;
void stopnieWGrafieSkierowanym(int macierzSasiedztwa[n][n], int stopnie[n]) {
for (int i = 0; i < n; ++i) {
stopnie[i] = 0;
for (int j = 0; j < n; ++j) {
if (macierzSasiedztwa[i][j] != 0) {
stopnie[i]++;
}
if (macierzSasiedztwa[j][i] != 0) {
stopnie[i]++;
}
}
}
}
int znajdzMaksymalnyStopien(int stopnie[n]) {
int maksymalnyStopien = stopnie[0];
for (int i = 1; i < n; ++i) {
if (stopnie[i] > maksymalnyStopien) {
maksymalnyStopien = stopnie[i];
}
}
return maksymalnyStopien;
}
int main() {
int macierzSasiedztwa[n][n] = {
{ 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 }
};
int stopnie[n];
stopnieWGrafieSkierowanym(macierzSasiedztwa, stopnie);
int maksymalnyStopien = znajdzMaksymalnyStopien(stopnie);
cout << "Stopien grafu skierowanego: " << maksymalnyStopien << endl;
return 0;
}
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