W tej sekcji znajdziesz przykłady implementacji reprezentacji grafów nieskierowanych bez wag oraz skierowanych bez wag w języku Java. Reprezentacje te zostały przedstawione w e‑materiale teoretycznymPpkZaFlK1e‑materiale teoretycznym, są to: macierz sąsiedztwa, lista sąsiedztwa, macierz incydencji.

Grafy nieskierowane

Macierz sąsiedztwa

Dany jest następujący graf spójny nieskierowany bez wag:

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

Macierz sąsiedztwa zaprezentowanego grafu nieskierowanego bez wag:

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

Napiszmy teraz program. Na potrzeby implementacji macierz sąsiedztwa będzie dwuwymiarową tablicą o wyrazach typu int, o n wierszach i n kolumnach. Gdybyśmy chcieli rozpocząć od macierzy wypełnionej samymi zerami, wykorzystalibyśmy następujący aspekt języka Java:

Każda zmienna klasy, zmienna instancji lub składnik tablicy są inicjowane wartością domyślną podczas jej tworzenia. Dla typu int wartością domyślną jest zero, czyli 0.

Wystarczy zatem tylko zadeklarować operatorem new dwuwymiarową tablicę o n wierszach i n kolumnach.

Linia 1. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy średnik.

Dodawanie krawędzi wykonujemy za pomocą funkcji polaczWierzcholki(), do której przekazujemy trzy argumenty: macierzSasiedztwa oraz indeksy dwóch wierzchołków, które chcemy połączyć, czyli i razem z j.

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

Przykład użycia takiej reprezentacji przedstawiony jest poniżej. Metoda wypisz() iteruje po każdym wierszu, a następnie po każdym wyrazie tego wiersza, wypisując macierz w konsoli. Ponieważ tablice w języku Java zawierają pole length, nie trzeba w naszym przykładzie definiować nowej zmiennej n przechowującej liczbę wierzchołków.

Linia 1. public class MacierzSasiedztwa otwórz nawias klamrowy. Linia 2. prawy ukośnik prawy ukośnik Metoda dodająca krawędź do grafu. Linia 3. static void polaczWierzcholki otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa przecinek int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości 1 średnik. Linia 5. macierzSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 1 średnik. Linia 6. zamknij nawias klamrowy. Linia 8. prawy ukośnik prawy ukośnik Metoda wypisze macierz sąsiedztwa. Linia 9. static void wypisz otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny macierzSasiedztwa kropka length średnik i plus plus 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 macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length średnik j plus plus zamknij nawias okrągły. Linia 12. System kropka out kropka print otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 13. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 15. zamknij nawias klamrowy. Linia 17. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. int n znak równości 6 średnik. Linia 19. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy średnik. Linia 21. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 1 zamknij nawias okrągły średnik. Linia 22. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 2 zamknij nawias okrągły średnik. Linia 23. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 4 zamknij nawias okrągły średnik. Linia 24. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 1 przecinek 2 zamknij nawias okrągły średnik. Linia 25. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 1 przecinek 4 zamknij nawias okrągły średnik. Linia 26. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 2 przecinek 3 zamknij nawias okrągły średnik. Linia 27. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 2 przecinek 5 zamknij nawias okrągły średnik. Linia 28. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 3 przecinek 4 zamknij nawias okrągły średnik. Linia 29. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 4 przecinek 5 zamknij nawias okrągły średnik. Linia 31. System kropka out kropka println otwórz nawias okrągły cudzysłów Pierwotna postac dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 32. wypisz otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik. Linia 33. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 35. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 36. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 5 zamknij nawias okrągły średnik. Linia 37. wypisz otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik. Linia 38. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 40. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 41. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 2 przecinek 4 zamknij nawias okrągły średnik. Linia 42. wypisz otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik. Linia 43. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 44. zamknij nawias klamrowy. Linia 45. zamknij nawias klamrowy.

Wyjście programu:

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

Lista sąsiedztwa

Lista sąsiedztwa zaprezentowanego grafu nieskierowanego bez wag:

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

W języku Java listę sąsiadów danego wierzchołka można zaimplementować z użyciem klasy LinkedList, która jest implementacją listy dwukierunkowej. LinkedList to klasa generycznatyp generycznyklasa generyczna z parametrem typu, zatem przy deklaracji zmiennej tej klasy musimy określić rodzaj przechowywanych elementów. W omawianym przypadku będziemy przechowywać zmienne typu int, więc deklaracja takiej listy sąsiadów będzie następująca:

Linia 1. LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny listaSasiadow znak równości new LinkedList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.

Cała lista sąsiedztwa nie jest pojedynczą listą, lecz zestawem list sąsiadów każdego wierzchołka. Potrzebujemy zatem pewnego rodzaju kontenera na ten zestaw list.

Pomocna tu będzie kolekcja ArrayList. Klasa ta reprezentowana przez interfejs java.util.list pozwoli nam tworzyć tablice o zmiennym rozmiarze i to za jej pomocą zaimplementujemy listę sąsiedztwa. Jej główną przewagą nad klasyczną tablicą jest to, że programista nie musi przejmować się rozmiarem,  jest ona bowiem automatycznie powiększana wraz z dodawaniem nowych elementów.

Podobnie jak LinkedList, także ArrayList jest klasą sparametryzowaną. Aby stworzyć listę tablicową o pojemności n przechowującą elementy typu LinkedList<Integer>, dodamy następująca deklarację:

Linia 1. ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa znak równości. Linia 2. new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły n zamknij nawias okrągły średnik.

Zmienna listaSasiedztwa o pojemności n została już zadeklarowana, ale nie zawiera jeszcze żadnej listy sąsiadów, musimy więc dla każdego wierzchołka stworzyć listę sąsiadów LinkedList i dodać ją do listy sąsiedztwa. Elementy do listy tablicowej ArrayList (podobnie jak LinkedList) dodajemy za pomocą metody add(). Nowy wyraz znajdzie się na końcu sekwencji.

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. listaSasiedztwa kropka add otwórz nawias okrągły new LinkedListInteger otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy.

Do elementów listy tablicowej ArrayList nie dostaniemy się za pomocą nawiasów kwadratowych.  Do tego celu ArrayList ma zdefiniowaną metodę get(). Aby uzyskać dostęp do elementu o indeksie i, do metody przekażemy zmienną i.

Linia 1. static void polaczWierzcholki otwórz nawias okrągły. Linia 2. ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa przecinek. Linia 3. int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. listaSasiedztwa kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka add otwórz nawias okrągły j zamknij nawias okrągły średnik. Linia 6. listaSasiedztwa kropka get otwórz nawias okrągły j zamknij nawias okrągły kropka add otwórz nawias okrągły i zamknij nawias okrągły średnik. Linia 7. zamknij nawias klamrowy.
1
Przykład 2

Pełen kod wykorzystujący opisaną implementację znajduje się poniżej. Do iteracji po każdym elemencie listy dwukierunkowej użyto pętli zasięgu, która przy każdym kroku przekazuje zmiennej j wartość kolejnego elementu listy sąsiadów.

Linia 1. import java kropka util kropka ArrayList średnik. Linia 2. import java kropka util kropka LinkedList średnik. Linia 4. public class ListaSasiedztwa otwórz nawias klamrowy. Linia 5. static int n znak równości 6 średnik. Linia 7. prawy ukośnik prawy ukośnik Metoda dodająca krawędź do grafu. Linia 8. static void polaczWierzcholki otwórz nawias okrągły ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa przecinek int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. listaSasiedztwa kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka add otwórz nawias okrągły j zamknij nawias okrągły średnik. Linia 10. listaSasiedztwa kropka get otwórz nawias okrągły j zamknij nawias okrągły kropka add otwórz nawias okrągły i zamknij nawias okrągły średnik. Linia 11. zamknij nawias klamrowy. Linia 13. prawy ukośnik prawy ukośnik Metoda wypisze listę sąsiedztwa. Linia 14. static void wypisz otwórz nawias okrągły ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny listaSasiedztwa kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. System kropka out kropka print otwórz nawias okrągły i plus cudzysłów dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 17. for otwórz nawias okrągły int j dwukropek listaSasiedztwa kropka get otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły. Linia 18. System kropka out kropka print otwórz nawias okrągły j plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 19. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 20. zamknij nawias klamrowy. Linia 21. zamknij nawias klamrowy. Linia 23. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 24. ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły n zamknij nawias okrągły średnik. Linia 25. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły. Linia 26. listaSasiedztwa kropka add otwórz nawias okrągły new LinkedList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 28. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 1 zamknij nawias okrągły średnik. Linia 29. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 2 zamknij nawias okrągły średnik. Linia 30. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 4 zamknij nawias okrągły średnik. Linia 31. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 1 przecinek 2 zamknij nawias okrągły średnik. Linia 32. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 1 przecinek 4 zamknij nawias okrągły średnik. Linia 33. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 2 przecinek 3 zamknij nawias okrągły średnik. Linia 34. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 2 przecinek 5 zamknij nawias okrągły średnik. Linia 35. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 3 przecinek 4 zamknij nawias okrągły średnik. Linia 36. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 4 przecinek 5 zamknij nawias okrągły średnik. Linia 38. System kropka out kropka println otwórz nawias okrągły cudzysłów Pierwotna postac dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 39. wypisz otwórz nawias okrągły listaSasiedztwa zamknij nawias okrągły średnik. Linia 40. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 42. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 43. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 5 zamknij nawias okrągły średnik. Linia 44. wypisz otwórz nawias okrągły listaSasiedztwa zamknij nawias okrągły średnik. Linia 45. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 47. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 48. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 2 przecinek 4 zamknij nawias okrągły średnik. Linia 49. wypisz otwórz nawias okrągły listaSasiedztwa zamknij nawias okrągły średnik. Linia 50. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 51. zamknij nawias klamrowy. Linia 52. zamknij nawias klamrowy.

Wyjście programu:

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

Macierz incydencji

Macierz incydencji zaprezentowanego grafu nieskierowanego bez wag:

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

Macierz incydencji zdefiniujemy jako dwuwymiarową tablicę o n wierszach i maxM kolumnach. Zmienna maxM jest równa maksymalnej liczbie krawędzi dla grafu o n wierzchołkach. Jako że rozmiar macierzy incydencji zależy od liczby krawędzi, to w celu zapamiętania aktualnej liczby krawędzi zdefiniujemy nową zmienną m. Wartość ta będzie wskazywała, ile kolumn macierzy ma zostać wyświetlonych lub w którym miejscu należy wstawić nową krawędź.

Linia 1. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy maxM zamknij nawias kwadratowy.

Na początku macierz będzie wypełniona zerami – nie ma potrzeby inicjowania tablicy. Dodawanie krawędzi odbywa się za pomocą funkcji polaczWierzcholki(), do której przekazujemy trzy argumenty: macierzIncydencji oraz indeksy dwóch wierzchołków, które chcemy połączyć, czyli i razem z j. Funkcja sprawdza, czy nie wykorzystaliśmy maksymalnej pojemności macierzy, a jeśli tak, to kończy swoje działanie. W przeciwnym wypadku następuje wpisanie jedynek odpowiednim wyrazom, po czym zmienna m zostaje zwiększona o 1.

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

Pełen kod implementacji macierzy incydencji przedstawiony jest poniżej. Funkcja wypisz() iteruje tylko do wyrazu o indeksie m - 1, wypisując tym samym macierz o rozmiarze n na m.

Linia 1. public class MacierzIncydencji otwórz nawias klamrowy. Linia 2. static int n znak równości 6 średnik prawy ukośnik prawy ukośnik Stała liczba wierzchołków. Linia 3. static int maxM znak równości 15 średnik prawy ukośnik prawy ukośnik Maksymalna liczba krawędzi. Linia 4. private static int m znak równości 0 średnik prawy ukośnik prawy ukośnik Aktualna liczba krawędzi. Linia 6. prawy ukośnik prawy ukośnik Metoda dodająca krawędź do grafu. Linia 7. static void polaczWierzcholki otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji przecinek int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. if otwórz nawias okrągły m zamknij nawias ostrokątny znak równości maxM zamknij nawias okrągły return średnik. Linia 9. macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości 1 średnik. Linia 10. macierzIncydencji otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości 1 średnik. Linia 11. m plus plus średnik. Linia 12. zamknij nawias klamrowy. Linia 14. prawy ukośnik prawy ukośnik Metoda macierz incydencji. Linia 15. static void wypisz otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny macierzIncydencji kropka length średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny m średnik j plus plus zamknij nawias okrągły. Linia 18. System kropka out kropka print otwórz nawias okrągły macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 19. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 20. zamknij nawias klamrowy. Linia 21. zamknij nawias klamrowy. Linia 23. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 24. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy maxM zamknij nawias kwadratowy średnik. Linia 26. prawy ukośnik prawy ukośnik Dodawanie początkowych krawędzi. Linia 27. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 1 zamknij nawias okrągły średnik. Linia 28. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 2 zamknij nawias okrągły średnik. Linia 29. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 4 zamknij nawias okrągły średnik. Linia 30. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 1 przecinek 2 zamknij nawias okrągły średnik. Linia 31. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 1 przecinek 4 zamknij nawias okrągły średnik. Linia 32. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 2 przecinek 3 zamknij nawias okrągły średnik. Linia 33. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 2 przecinek 5 zamknij nawias okrągły średnik. Linia 34. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 3 przecinek 4 zamknij nawias okrągły średnik. Linia 35. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 4 przecinek 5 zamknij nawias okrągły średnik. Linia 36. System kropka out kropka println otwórz nawias okrągły cudzysłów Pierwotna postac dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 37. wypisz otwórz nawias okrągły macierzIncydencji zamknij nawias okrągły średnik. Linia 38. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 40. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 41. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 5 zamknij nawias okrągły średnik. Linia 42. wypisz otwórz nawias okrągły macierzIncydencji zamknij nawias okrągły średnik. Linia 43. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 45. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 46. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 2 przecinek 4 zamknij nawias okrągły średnik. Linia 47. wypisz otwórz nawias okrągły macierzIncydencji zamknij nawias okrągły średnik. Linia 48. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 49. zamknij nawias klamrowy. Linia 50. zamknij nawias klamrowy.

Wyjście programu:

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

Grafy skierowane

Dany jest następujący graf spójny skierowany bez wag:

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

Macierz sąsiedztwa

Macierz sąsiedztwa zaprezentowanego grafu skierowanego bez wag:

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

Przejdźmy do implementacji programu.

Deklarujemy operatorem new dwuwymiarową tablicę o n wierszach i n kolumnach.

Linia 1. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy średnik.

Dodajemy krawędzie za pomocą funkcji polaczWierzcholki(), do której przekazujemy trzy argumenty: macierzSasiedztwa oraz indeksy dwóch wierzchołków, które chcemy połączyć, czyli i razem z j.

Zwróć uwagę na to, że w przypadku grafów skierowanych znaczenie ma kierunek krawędzi. Dodawana krawędź zaczyna się w wierzchołku i, natomiast kończy w wierzchołku j. Dlatego w przypadku macierzy sąsiedztwa element o indeksach [i][j] przyjmuje wartość 1, natomiast element o indeksach [j][i] przyjmuje wartość 0.

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

Zapoznajmy się z przykładem użycia takiej reprezentacji.

Linia 1. public class MacierzSasiedztwa otwórz nawias klamrowy. Linia 2. prawy ukośnik prawy ukośnik Metoda dodająca krawędź do grafu. Linia 3. static void polaczWierzcholki otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa przecinek int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości 1 średnik. Linia 5. macierzSasiedztwa otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości 0 średnik. Linia 6. zamknij nawias klamrowy. Linia 8. prawy ukośnik prawy ukośnik Metoda wypisze macierz sąsiedztwa. Linia 9. static void wypisz otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny macierzSasiedztwa kropka length średnik i plus plus 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 macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length średnik j plus plus zamknij nawias okrągły. Linia 12. System kropka out kropka print otwórz nawias okrągły macierzSasiedztwa otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 13. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 15. zamknij nawias klamrowy. Linia 17. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. int n znak równości 6 średnik. Linia 19. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzSasiedztwa znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy n zamknij nawias kwadratowy średnik. Linia 21. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 1 zamknij nawias okrągły średnik. Linia 22. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 2 zamknij nawias okrągły średnik. Linia 23. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 4 zamknij nawias okrągły średnik. Linia 24. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 1 przecinek 2 zamknij nawias okrągły średnik. Linia 25. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 1 przecinek 4 zamknij nawias okrągły średnik. Linia 26. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 2 przecinek 3 zamknij nawias okrągły średnik. Linia 27. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 2 przecinek 5 zamknij nawias okrągły średnik. Linia 28. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 3 przecinek 4 zamknij nawias okrągły średnik. Linia 29. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 4 przecinek 5 zamknij nawias okrągły średnik. Linia 30. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 5 przecinek 4 zamknij nawias okrągły średnik. Linia 32. System kropka out kropka println otwórz nawias okrągły cudzysłów Pierwotna postac dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 33. wypisz otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik. Linia 34. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 36. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 37. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 0 przecinek 5 zamknij nawias okrągły średnik. Linia 38. wypisz otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik. Linia 39. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 41. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 42. polaczWierzcholki otwórz nawias okrągły macierzSasiedztwa przecinek 2 przecinek 4 zamknij nawias okrągły średnik. Linia 43. wypisz otwórz nawias okrągły macierzSasiedztwa zamknij nawias okrągły średnik. Linia 44. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 45. zamknij nawias klamrowy. Linia 46. zamknij nawias klamrowy.

Wyjście programu:

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

Lista sąsiedztwa

Lista sąsiedztwa zaprezentowanego grafu skierowanego bez wag:

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

Implementujemy listę sąsiadów wierzchołka:

Linia 1. LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny listaSasiadow znak równości new LinkedList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik.

Ponieważ cała lista sąsiedztwa nie jest pojedynczą listą, a zestawem list, ponownie wykorzystamy kolekcję ArrayList.

Tworzymy listę tablicową o pojemności n przechowującą elementy typu LinkedList<Integer>:

Linia 1. ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa znak równości. Linia 2. new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły n zamknij nawias okrągły średnik.

Dotychczas zadeklarowaliśmy zmienną listaSasiedztwa o pojemności n, nie zawiera ona jednak jeszcze żadnej listy sąsiadów. Dla każdego wierzchołka tworzymy listę sąsiadów LinkedList i dodajemy ją do listy sąsiedztwa. Do listy tablicowej ArrayList (podobnie jak LinkedList) elementy dodajemy za pomocą metody add(). Nowy wyraz znajdzie się na końcu sekwencji.

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. listaSasiedztwa kropka add otwórz nawias okrągły new LinkedListInteger otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy.

Aby dostać się do elementów listy tablicowej ArrayList, zastosujemy metodę get(). Aby uzyskać dostęp do elementu o indeksie i, do metody przekażemy zmienną j.

Element o indeksie i to wierzchołek, w którym zaczyna się krawędź. Zmienna j przechowuje informację na temat wierzchołka, w którym krawędź się kończy (zgodnie z jej kierunkiem).

Linia 1. static void polaczWierzcholki otwórz nawias okrągły. Linia 2. ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa przecinek. Linia 3. int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. listaSasiedztwa kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka add otwórz nawias okrągły j zamknij nawias okrągły średnik. Linia 6. zamknij nawias klamrowy.
1
Przykład 5

Prześledźmy kod, w którym zastosowano opisaną implementację.

Linia 1. import java kropka util kropka ArrayList średnik. Linia 2. import java kropka util kropka LinkedList średnik. Linia 4. public class ListaSasiedztwa otwórz nawias klamrowy. Linia 5. static int n znak równości 6 średnik. Linia 7. prawy ukośnik prawy ukośnik Metoda dodająca krawędź do grafu. Linia 8. static void polaczWierzcholki otwórz nawias okrągły ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa przecinek int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. listaSasiedztwa kropka get otwórz nawias okrągły i zamknij nawias okrągły kropka add otwórz nawias okrągły j zamknij nawias okrągły średnik. Linia 10. zamknij nawias klamrowy. Linia 12. prawy ukośnik prawy ukośnik Metoda wypisze listę sąsiedztwa. Linia 13. static void wypisz otwórz nawias okrągły ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny listaSasiedztwa kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. System kropka out kropka print otwórz nawias okrągły i plus cudzysłów dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 16. for otwórz nawias okrągły int j dwukropek listaSasiedztwa kropka get otwórz nawias okrągły i zamknij nawias okrągły zamknij nawias okrągły. Linia 17. System kropka out kropka print otwórz nawias okrągły j plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 18. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 19. zamknij nawias klamrowy. Linia 20. zamknij nawias klamrowy. Linia 22. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 23. ArrayList otwórz nawias ostrokątny LinkedList otwórz nawias ostrokątny Integer zamknij nawias ostrokątny zamknij nawias ostrokątny listaSasiedztwa znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły n zamknij nawias okrągły średnik. Linia 24. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik i plus plus zamknij nawias okrągły. Linia 25. listaSasiedztwa kropka add otwórz nawias okrągły new LinkedList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 27. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 1 zamknij nawias okrągły średnik. Linia 28. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 2 zamknij nawias okrągły średnik. Linia 29. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 4 zamknij nawias okrągły średnik. Linia 30. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 1 przecinek 2 zamknij nawias okrągły średnik. Linia 31. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 1 przecinek 4 zamknij nawias okrągły średnik. Linia 32. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 2 przecinek 3 zamknij nawias okrągły średnik. Linia 33. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 2 przecinek 5 zamknij nawias okrągły średnik. Linia 34. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 3 przecinek 4 zamknij nawias okrągły średnik. Linia 35. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 4 przecinek 5 zamknij nawias okrągły średnik. Linia 36. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 5 przecinek 4 zamknij nawias okrągły średnik. Linia 38. System kropka out kropka println otwórz nawias okrągły cudzysłów Pierwotna postac dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 39. wypisz otwórz nawias okrągły listaSasiedztwa zamknij nawias okrągły średnik. Linia 40. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 42. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 43. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 0 przecinek 5 zamknij nawias okrągły średnik. Linia 44. wypisz otwórz nawias okrągły listaSasiedztwa zamknij nawias okrągły średnik. Linia 45. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 47. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 48. polaczWierzcholki otwórz nawias okrągły listaSasiedztwa przecinek 2 przecinek 4 zamknij nawias okrągły średnik. Linia 49. wypisz otwórz nawias okrągły listaSasiedztwa zamknij nawias okrągły średnik. Linia 50. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 51. zamknij nawias klamrowy. Linia 52. zamknij nawias klamrowy.

Wyjście programu:

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

Macierz incydencji

Macierz incydencji zaprezentowanego grafu skierowanego bez wag:

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

Definiujemy macierz incydencji jako dwuwymiarową tablicę o n wierszach i maxM kolumnach.

Linia 1. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy maxM zamknij nawias kwadratowy.

Początkowo macierz będzie wypełniona zerami, więc nie musimy inicjować tablicy.

Dodajemy krawędzie, używając funkcji polaczWierzcholki(), do której przekazujemy trzy argumenty: macierzIncydencji oraz indeksy dwóch wierzchołków, które chcemy połączyć, czyli i razem z j. Funkcja weryfikuje, czy nie wykorzystaliśmy maksymalnej pojemności macierzy. Jeśli tak – kończymy działanie funkcji. Jeśli nie, w przypadku tej reprezentacji, wierzchołkowi i przypisujemy wartość 1 (tam krawędź się zaczyna), natomiast wierzchołkowi, w którym się kończy (zgodnie z kierunkiem krawędzi) przypisujemy wartość -1.

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

Przeanalizujmy kod implementacji macierzy incydencji.

Linia 1. public class MacierzIncydencji otwórz nawias klamrowy. Linia 2. static int n znak równości 6 średnik prawy ukośnik prawy ukośnik Stała liczba wierzchołków. Linia 3. static int maxM znak równości 15 średnik prawy ukośnik prawy ukośnik Maksymalna liczba krawędzi. Linia 4. private static int m znak równości 0 średnik prawy ukośnik prawy ukośnik Aktualna liczba krawędzi. Linia 6. prawy ukośnik prawy ukośnik Metoda dodająca krawędź do grafu. Linia 7. static void polaczWierzcholki otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji przecinek int i przecinek int j zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. if otwórz nawias okrągły m zamknij nawias ostrokątny znak równości maxM zamknij nawias okrągły return średnik. Linia 9. macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości 1 średnik. Linia 10. macierzIncydencji otwórz nawias kwadratowy j zamknij nawias kwadratowy otwórz nawias kwadratowy m zamknij nawias kwadratowy znak równości minus 1 średnik. Linia 11. m plus plus średnik. Linia 12. zamknij nawias klamrowy. Linia 14. prawy ukośnik prawy ukośnik Metoda macierz incydencji. Linia 15. static void wypisz otwórz nawias okrągły int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny macierzIncydencji kropka length średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny m średnik j plus plus zamknij nawias okrągły. Linia 18. System kropka out kropka print otwórz nawias okrągły macierzIncydencji otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy plus cudzysłów lewy ukośnik t cudzysłów zamknij nawias okrągły średnik. Linia 19. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 20. zamknij nawias klamrowy. Linia 21. zamknij nawias klamrowy. Linia 23. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 24. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy macierzIncydencji znak równości new int otwórz nawias kwadratowy n zamknij nawias kwadratowy otwórz nawias kwadratowy maxM zamknij nawias kwadratowy średnik. Linia 26. prawy ukośnik prawy ukośnik Dodawanie początkowych krawędzi. Linia 27. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 1 zamknij nawias okrągły średnik. Linia 28. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 2 zamknij nawias okrągły średnik. Linia 29. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 4 zamknij nawias okrągły średnik. Linia 30. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 1 przecinek 2 zamknij nawias okrągły średnik. Linia 31. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 1 przecinek 4 zamknij nawias okrągły średnik. Linia 32. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 2 przecinek 3 zamknij nawias okrągły średnik. Linia 33. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 2 przecinek 5 zamknij nawias okrągły średnik. Linia 34. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 3 przecinek 4 zamknij nawias okrągły średnik. Linia 35. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 4 przecinek 5 zamknij nawias okrągły średnik. Linia 36. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 5 przecinek 4 zamknij nawias okrągły średnik. Linia 37. System kropka out kropka println otwórz nawias okrągły cudzysłów Pierwotna postac dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 38. wypisz otwórz nawias okrągły macierzIncydencji zamknij nawias okrągły średnik. Linia 39. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 41. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 0 przecinek 5 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 42. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 0 przecinek 5 zamknij nawias okrągły średnik. Linia 43. wypisz otwórz nawias okrągły macierzIncydencji zamknij nawias okrągły średnik. Linia 44. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 46. System kropka out kropka println otwórz nawias okrągły cudzysłów Po wywolaniu polaczWierzcholki otwórz nawias okrągły 2 przecinek 4 zamknij nawias okrągły dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 47. polaczWierzcholki otwórz nawias okrągły macierzIncydencji przecinek 2 przecinek 4 zamknij nawias okrągły średnik. Linia 48. wypisz otwórz nawias okrągły macierzIncydencji zamknij nawias okrągły średnik. Linia 49. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 50. zamknij nawias klamrowy. Linia 51. zamknij nawias klamrowy.

Wyjście programu:

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

Słownik

graf
graf

struktura składająca się z niepustego zbioru wierzchołków oraz rodziny krawędzi; dla grafu G zbiór wierzchołków oznaczamy V(G) (ang. verticies – wierzchołki), a rodzinę krawędzi –E(G) (ang. edges – krawędzie); liczbę elementów zbioru V(G) oznaczamy literą  n; liczbę elementów rodziny E(G)m

graf spójny
graf spójny

graf, którego nie można przedstawić w postaci sumy dwóch grafów

krawędź
krawędź

nieuporządkowana para (niekoniecznie różnych) elementów zbioru wierzchołków

incydencja
incydencja

relacja między wierzchołkami a łączącą je krawędzią grafu; mówimy, że dwa sąsiednie wierzchołki połączone pewną krawędzią są incydentne z tą krawędzią

izomorfizm
izomorfizm

właściwość grafów polegająca na tym, że między grafami występuje wzajemnie jednoznaczna odpowiedniość wierzchołków; liczba krawędzi łączących dane dwa wierzchołki jednego grafu jest równa liczbie krawędzi łączących odpowiadające im wierzchołki drugiego grafu

lista sąsiedztwa
lista sąsiedztwa

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

macierz
macierz

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

macierz incydencji
macierz incydencji

macierz zerojedynkowa rozmiaru |V|×|E|, dla której każda krawędź grafu musi mieć unikatowy indeks; wyraz jest równy , o ile krawędź o indeksie jest incydentna do wierzchołka

macierz sąsiedztwa
macierz sąsiedztwa

macierz zerojedynkowa rozmiaru |V|×|V|, w której wyraz jest równy , jeśli wierzchołki oraz są sąsiednie, a  w przeciwnym przypadku; macierz sąsiedztwa jest symetryczna dla grafów nieskierowanych

stopień wierzchołka
stopień wierzchołka

liczba krawędzi incydentnych z danym wierzchołkiem

typ generyczny
typ generyczny

klasa lub interfejs sparametryzowany względem typów podanych przy deklaracji; do określenia parametrów typu używamy nawiasów ostrych (<>); typy generyczne umożliwiają napisanie ogólnej definicji, która działa z różnymi typami, pozwalając tym samym na ponowne użycie kodu bez konieczności definiowania nowych definicji klas lub interfejsu działających na innym typie zmiennych

wierzchołek
wierzchołek

element należący do zbioru wierzchołków