Graf to struktura składająca się z wierzchołków (ang. vertices) połączonych krawędziami (ang. edges). Grafy modelują relacje między obiektami: mapy dróg, sieci społecznościowe, połączenia internetowe, zależności między zadaniami.
| Rodzaj grafu | Opis | Przykład |
|---|---|---|
| Nieskierowany | Krawędź działa w obie strony | Znajomości na Facebooku |
| Skierowany (digraf) | Krawędź ma kierunek | Obserwowanie na Twitterze/X |
| Ważony | Krawędzie mają przypisaną wartość (koszt) | Mapa dróg z odległościami |
Tablica dwuwymiarowa n×n, gdzie macierz[i][j] = 1 oznacza krawędź między wierzchołkami i oraz j. Zajmuje O(V²) pamięci niezależnie od liczby krawędzi — dobra dla gęstych grafów.
Słownik, gdzie każdy wierzchołek wskazuje na listę swoich sąsiadów. Zajmuje O(V + E) pamięci — znacznie oszczędniejsza dla grafów rzadkich (typowych w praktyce).
Odwiedza wierzchołki "warstwami" — najpierw wszystkich sąsiadów, potem sąsiadów sąsiadów. Znajduje najkrótszą ścieżkę pod względem liczby krawędzi w grafie nieskierowanym/nieważonym.
Zagłębia się maksymalnie w jedną ścieżkę, zanim zawróci. Naturalnie implementowana rekurencyjnie (bo rekurencja sama w sobie używa stosu wywołań).
Wykorzystując funkcję bfs, napisz funkcję czy_spojny(graf), która sprawdzi, czy ze startowego wierzchołka można dojść do wszystkich pozostałych (czyli czy graf jest spójny).
Zmodyfikuj BFS, aby oprócz kolejności odwiedzania zwracał także słownik odległości (w liczbie krawędzi) od wierzchołka startowego do każdego innego wierzchołka.
1. Która struktura danych jest naturalnie używana do implementacji BFS?
2. Jaka jest złożoność pamięciowa reprezentacji grafu listą sąsiedztwa?
3. Który algorytm zagłębia się maksymalnie w jedną ścieżkę przed zawróceniem?