graph implementation c using adjacency list
Ten samouczek wyjaśnia implementację wykresów w C ++. Dowiesz się również o różnych typach, reprezentacjach i zastosowaniach wykresów:
Wykres to nieliniowa struktura danych. Graf można zdefiniować jako zbiór węzłów, zwanych także „wierzchołkami” i „krawędziami”, które łączą dwa lub więcej wierzchołków.
Graf można również postrzegać jako drzewo cykliczne, w którym wierzchołki nie mają relacji rodzic-dziecko, ale utrzymują między sobą złożoną relację.
najlepsze darmowe oprogramowanie do czyszczenia komputera
=> Kliknij tutaj, aby zapoznać się z serią szkoleń Absolute C ++.
Czego się nauczysz:
Co to jest wykres w C ++?
Jak wspomniano powyżej, wykres w C ++ jest nieliniową strukturą danych zdefiniowaną jako zbiór wierzchołków i krawędzi.
Poniżej znajduje się przykład struktury danych wykresu.
Podany powyżej jest przykładowy wykres G. Wykres G to zbiór wierzchołków {A, B, C, D, E} oraz zbiór krawędzi {(A, B), (B, C), (A, D), (D, E), (E, C), (B, E), (B, D)}.
Rodzaje wykresów - wykres ukierunkowany i nieukierunkowany
Graf, w którym krawędzie nie mają kierunków, nazywany jest grafem niekierowanym. Wykres pokazany powyżej jest wykresem nie skierowanym.
Wykres, w którym krawędzie mają skojarzone z nimi kierunki, nazywany jest wykresem skierowanym.
Poniżej podano przykład skierowanego wykresu.
Na wykresie skierowanym pokazanym powyżej, krawędzie tworzą uporządkowaną parę, w której każda krawędź reprezentuje określoną ścieżkę od jednego wierzchołka do drugiego. Wierzchołek, z którego rozpoczyna się ścieżka, nazywany jest „ Węzeł początkowy ”, Podczas gdy wierzchołek, do którego kończy się ścieżka, nazywany jest„ Węzeł terminala ”.
Zatem na powyższym wykresie zbiór wierzchołków to {A, B, C, D, E}, a zbiór krawędzi to {(A, B), (A, D), (B, C), (B, E ), (D, E) (E, C)}.
Omówimy terminologię dotyczącą wykresów lub powszechnie używane terminy w odniesieniu do poniższego wykresu.
Terminologia graficzna
- Wierzchołek: Każdy węzeł wykresu nazywany jest wierzchołkiem. Na powyższym wykresie A, B, C i D są wierzchołkami wykresu.
- Brzeg: Łącze lub ścieżka między dwoma wierzchołkami nazywa się krawędzią. Łączy dwa lub więcej wierzchołków. Różne krawędzie na powyższym wykresie to AB, BC, AD i DC.
- Węzeł sąsiedni: Na wykresie, jeśli dwa węzły są połączone krawędzią, nazywa się je węzłami sąsiednimi lub sąsiadami. Na powyższym wykresie wierzchołki A i B są połączone krawędzią AB. Zatem A i B są sąsiednimi węzłami.
- Stopień węzła: Liczba krawędzi połączonych z określonym węzłem nazywana jest stopniem węzła. Na powyższym wykresie węzeł A ma stopień 2.
- Ścieżka: Sekwencja węzłów, którą musimy podążać, gdy musimy podróżować od jednego wierzchołka do drugiego na grafie, nazywa się ścieżką. Na naszym przykładowym wykresie, jeśli musimy przejść od węzła A do C, ścieżka będzie wyglądać tak: A-> B-> C.
- Zamknięta ścieżka: Jeśli węzeł początkowy jest taki sam jak węzeł końcowy, wówczas ta ścieżka jest określana jako ścieżka zamknięta.
- Prosta ścieżka: Ścieżka zamknięta, w której wszystkie inne węzły są różne, nazywana jest ścieżką prostą.
- Cykl: Ścieżka, na której nie ma powtarzających się krawędzi ani wierzchołków, a pierwszy i ostatni wierzchołek są takie same, nazywana jest cyklem. Na powyższym wykresie A-> B-> C-> D-> A to cykl.
- Połączony wykres: Graf połączony to taki, w którym między każdym z wierzchołków znajduje się ścieżka. Oznacza to, że nie ma ani jednego wierzchołka, który byłby izolowany lub bez krawędzi łączącej. Wykres pokazany powyżej jest wykresem połączonym.
- Kompletny wykres: Wykres, w którym każdy węzeł jest połączony z innym, nazywany jest wykresem pełnym. Jeśli N jest całkowitą liczbą węzłów na wykresie, to cały wykres zawiera N (N-1) / 2 liczby krawędzi.
- Wykres ważony: Dodatnią wartość przypisaną do każdej krawędzi, wskazującą na jej długość (odległość między wierzchołkami połączonymi krawędzią) nazywa się wagą. Wykres zawierający ważone krawędzie nazywany jest wykresem ważonym. Ciężar krawędzi e jest oznaczony przez w (e) i wskazuje na koszt przejścia przez krawędź.
- Wykres: Dwuznak to wykres, na którym każda krawędź jest powiązana z określonym kierunkiem, a przemierzanie można wykonać tylko w określonym kierunku.
Reprezentacja wykresu
Sposób, w jaki struktura danych wykresu jest przechowywana w pamięci, nazywany jest „reprezentacją”. Wykres może być przechowywany jako reprezentacja sekwencyjna lub jako reprezentacja połączona.
Oba te typy opisano poniżej.
Reprezentacja sekwencyjna
W sekwencyjnej reprezentacji grafów używamy macierzy sąsiedztwa. Macierz sąsiedztwa to macierz o rozmiarze n x n, gdzie n to liczba wierzchołków wykresu.
Wiersze i kolumny macierzy sąsiedztwa reprezentują wierzchołki na wykresie. Element macierzy jest ustawiany na 1, gdy między wierzchołkami występuje krawędź. Jeśli nie ma krawędzi, element jest ustawiany na 0.
Poniżej przedstawiono przykładowy wykres przedstawiający macierz sąsiedztwa.
Widzieliśmy macierz sąsiedztwa dla powyższego wykresu. Zauważ, że ponieważ jest to wykres nieukierunkowany i możemy powiedzieć, że krawędź jest obecna w obu kierunkach. Na przykład, ponieważ krawędź AB jest obecna, możemy wywnioskować, że krawędź BA jest również obecna.
W macierzy sąsiedztwa możemy zobaczyć interakcje wierzchołków, które są elementami macierzy, które są ustawiane na 1, gdy krawędź jest obecna i na 0, gdy krawędź jest nieobecna.
Spójrzmy teraz na macierz sąsiedztwa skierowanego wykresu.
Jak pokazano powyżej, element przecięcia w macierzy sąsiedztwa będzie wynosił 1 wtedy i tylko wtedy, gdy istnieje krawędź skierowana od jednego wierzchołka do drugiego.
Na powyższym wykresie mamy dwie krawędzie od wierzchołka A. Jedna krawędź kończy się wierzchołkiem B, a druga kończy się wierzchołkiem C. Zatem w macierzy sąsiedztwa przecięcie A i B jest ustawione na 1 jako przecięcie A i C.
Następnie zobaczymy sekwencyjną reprezentację ważonego wykresu.
Poniżej przedstawiono ważony wykres i odpowiadającą mu macierz sąsiedztwa.
Widzimy, że sekwencyjna reprezentacja wykresu ważonego różni się od innych typów wykresów. Tutaj niezerowe wartości w macierzy sąsiedztwa są zastępowane przez rzeczywistą wagę krawędzi.
Krawędź AB ma wagę = 4, więc w macierzy sąsiedztwa ustawiamy przecięcie A i B na 4. Podobnie wszystkie inne niezerowe wartości są zamieniane na odpowiadające im wagi.
Lista sąsiedztwa jest łatwiejsza do wdrożenia i naśladowania. Przemierzanie, czyli sprawdzenie, czy istnieje krawędź od jednego wierzchołka do drugiego, zajmuje O (1) czasu, a usunięcie krawędzi również wymaga O (1).
Niezależnie od tego, czy wykres jest rzadki (mniej krawędzi), czy gęsty, zawsze zajmuje więcej miejsca.
Powiązana reprezentacja
Używamy listy sąsiedztwa do połączonej reprezentacji wykresu. Reprezentacja listy przylegania zachowuje każdy węzeł wykresu i łącze do węzłów sąsiadujących z tym węzłem. Kiedy przechodzimy przez wszystkie sąsiednie węzły, ustawiamy następny wskaźnik na null na końcu listy.
Rozważmy najpierw wykres nieukierunkowany i listę jego sąsiadów.
Jak pokazano powyżej, mamy połączoną listę (listę sąsiedztwa) dla każdego węzła. Od wierzchołka A mamy krawędzie do wierzchołków B, C i D. Zatem te węzły są połączone z węzłem A na odpowiedniej liście przylegania.
Następnie tworzymy listę sąsiedztwa dla skierowanego grafu.
Na powyższym wykresie widzimy, że nie ma żadnych krawędzi pochodzących z wierzchołka E. Stąd lista sąsiedztwa dla wierzchołka E jest pusta.
Skonstruujmy teraz listę sąsiedztwa dla ważonego wykresu.
W przypadku wykresu ważonego dodajemy dodatkowe pole w węźle listy sąsiedztwa, aby oznaczyć wagę krawędzi, jak pokazano powyżej.
Dodanie wierzchołka do listy przylegania jest łatwiejsze. Oszczędza również miejsce dzięki implementacji listy połączonej. Kiedy musimy dowiedzieć się, czy między jednym wierzchołkiem a drugim jest krawędź, operacja nie jest wydajna.
Podstawowe operacje na wykresach
Poniżej przedstawiono podstawowe operacje, które możemy wykonać na strukturze danych wykresu:
- Dodaj wierzchołek: Dodaje wierzchołek do wykresu.
- Dodaj krawędź: Dodaje krawędź między dwoma wierzchołkami wykresu.
- Wyświetl wierzchołki wykresu: Wyświetl wierzchołki wykresu.
Implementacja wykresu C ++ przy użyciu listy sąsiedztwa
Teraz przedstawiamy implementację C ++, aby zademonstrować prosty wykres przy użyciu listy sąsiedztwa.
Tutaj mamy zamiar wyświetlić listę sąsiedztwa dla ważonego wykresu skierowanego. Użyliśmy dwóch struktur do przechowywania listy sąsiedztwa i krawędzi wykresu. Lista sąsiedztwa jest wyświetlana jako (start_vertex, end_vertex, weight).
Program w C ++ wygląda następująco:
#include using namespace std; // stores adjacency list items struct adjNode { int val, cost; adjNode* next; }; // structure to store edges struct graphEdge { int start_ver, end_ver, weight; }; class DiaGraph{ // insert new nodes into adjacency list from given graph adjNode* getAdjListNode(int value, int weight, adjNode* head) { adjNode* newNode = new adjNode; newNode->val = value; newNode->cost = weight; newNode->next = head; // point new node to current head return newNode; } int N; // number of nodes in the graph public: adjNode **head; //adjacency list as array of pointers // Constructor DiaGraph(graphEdge edges(), int n, int N) { // allocate new node head = new adjNode*(N)(); this->N = N; // initialize head pointer for all vertices for (int i = 0; i Wynik:
Wynik:
Wykres listy sąsiedztwa
(start_vertex, end_vertex, weight):
(0, 2, 4) (0, 1, 2)
(1, 4, 3)
(2, 3, 2)
(3, 1, 4)
(4, 3, 3)

Zastosowania wykresów
Omówmy niektóre zastosowania grafów.
darmowe strony z anime do oglądania online
- Grafy są szeroko stosowane w informatyce do przedstawiania grafów sieciowych lub semantycznych, a nawet do przedstawiania przepływu obliczeń.
- Wykresy są szeroko stosowane w kompilatorach do zobrazowania alokacji zasobów do procesów lub do wskazania analizy przepływu danych itp.
- Wykresy są również używane do optymalizacji zapytań w językach baz danych w niektórych wyspecjalizowanych kompilatorach.
- W serwisach społecznościowych wykresy są głównymi strukturami przedstawiającymi sieć ludzi.
- Wykresy są szeroko wykorzystywane do budowy systemu transportowego, zwłaszcza sieci drogowej. Popularnym przykładem są mapy Google, które szeroko wykorzystują wykresy do wskazywania kierunków na całym świecie.
Wniosek
Wykres jest popularną i szeroko stosowaną strukturą danych, która ma wiele zastosowań w samej dziedzinie informatyki oprócz innych dziedzin. Wykresy składają się z wierzchołków i krawędzi łączących dwa lub więcej wierzchołków.
Wykres może być skierowany lub nieukierunkowany. Możemy przedstawić wykresy za pomocą macierzy sąsiedztwa, która jest reprezentacją liniową, jak również za pomocą połączonej listy sąsiedztwa. Omówiliśmy również implementację wykresu w tym samouczku.
=> Zobacz tutaj, aby poznać pełną listę samouczków języka C ++.
rekomendowane lektury
- Python Advanced List tutorial (sortowanie listy, odwracanie, indeks, kopiowanie, łączenie, sumowanie)
- Lista Pythona - twórz, korzystaj, tnij, dodawaj lub usuwaj elementy
- Domyślna lista adresów IP routerów dla popularnych marek routerów bezprzewodowych
- 12 najlepszych narzędzi do tworzenia wykresów liniowych do tworzenia oszałamiających wykresów liniowych (2021 RANKINGS)
- Domyślne hasło logowania do routera dla najlepszych modeli routerów (lista 2021)
- Struktura danych listy połączonej w C ++ z ilustracją
- Struktura danych listy połączonej cyklicznie w C ++ z ilustracją
- Struktura danych listy podwójnie połączonych w C ++ z ilustracjami