Strona główna Sieci Minimalne drzewo rozpinające

🌲 Minimalne drzewo rozpinające

Animacja krok po kroku algorytmów MST Kruskala i Prima na losowym grafie ważonym. Koszty krawędzi widoczne na łukach; przełączaj algorytmy i zobacz, jak każdy buduje optymalne drzewo rozpinające.

Sieci2DŁatwy60 FPS
minimum-spanning-tree ↗ Otwórz osobno
Interfejs samej symulacji jest w języku angielskim.
Symulacja minimalnego drzewa rozpinającego animująca krok po kroku algorytmy Kruskala i Prima na losowym grafie ważonym. Algorytm Kruskala sortuje wszystkie krawędzie według wagi i wykorzystuje strukturę Union-Find (DSU), by zachłannie dodawać najtańszą krawędź, która nie tworzy cyklu. Algorytm Prima rozbudowuje drzewo od wierzchołka startowego, zawsze dodając najtańszą krawędź łączącą bieżące drzewo z nieodwiedzonym wierzchołkiem. Koszty krawędzi są wyświetlane na każdym łuku.

O tej symulacji

Ta symulacja animuje dwa klasyczne algorytmy zachłanne — Kruskala i Prima — które obliczają minimalne drzewo rozpinające (MST) grafu ważonego: podzbiór krawędzi łączący wszystkie wierzchołki przy możliwie najniższej sumarycznej wadze krawędzi. Wierzchołki są rozrzucone po płótnie i połączone z najbliższymi sąsiadami, a każda krawędź niesie numeryczny koszt. Obserwowanie, jak drzewo rośnie krawędź po krawędzi, pokazuje, jak zupełnie różne strategie dochodzą do tej samej optymalnej struktury — wynik gwarantowany przez własność cięcia drzew rozpinających.

🔬 Co przedstawia

Losowy graf ważony o 8–40 wierzchołkach, każdy połączony w przybliżeniu z czterema najbliższymi sąsiadami, z wagami wyznaczonymi na podstawie odległości na ekranie. Algorytm Kruskala sortuje wszystkie krawędzie według wagi i dodaje najtańszą, która nie tworzy cyklu, wykorzystując strukturę Union-Find (zbiory rozłączne) do wykrywania cykli. Algorytm Prima zamiast tego rozbudowuje pojedyncze drzewo od wierzchołka 0, wielokrotnie dodając najtańszą krawędź prowadzącą do nieodwiedzonego wierzchołka. Oba kończą pracę z dokładnie N−1 krawędziami i tą samą minimalną wagą całkowitą.

🎮 Jak korzystać

Przełączaj między trybem Kruskal i Prim, a następnie ustaw liczbę wierzchołków suwakiem Wierzchołki (8–40). Wybierz prędkość odtwarzania Wolno, Normalnie lub Szybko. Naciśnij Play, aby animować w sposób ciągły, lub Krok, aby przechodzić po jednej decyzji, obserwując krawędzie kandydujące (żółte), zaakceptowane (zielone) i odrzucone (czerwone). Nowy graf generuje nowy układ. Panel boczny śledzi liczbę wierzchołków, łączną liczbę krawędzi, krawędzie MST oraz bieżącą wagę MST.

💡 Czy wiesz, że?

Oba algorytmy są dowodliwie optymalne, choć algorytm Kruskala opublikowano w 1956 roku, a Prima w 1957 (po raz pierwszy opisał go Jarník już w 1930). W grafie o unikalnych wagach krawędzi minimalne drzewo rozpinające jest jednoznaczne, więc Kruskal i Prim zawsze zbiegają do identycznego zestawu krawędzi, mimo że przeszukują graf w zupełnie innej kolejności.

Najczęściej zadawane pytania

Czym jest minimalne drzewo rozpinające?

Drzewo rozpinające to zbiór krawędzi łączący wszystkie wierzchołki grafu bez tworzenia żadnego cyklu, który dla N wierzchołków zawsze wykorzystuje dokładnie N−1 krawędzi. Minimalne drzewo rozpinające to drzewo rozpinające, którego suma wag krawędzi jest najmniejsza z możliwych. Jest szeroko stosowane do projektowania tanich sieci, takich jak okablowanie, rurociągi i połączenia drogowe.

Czym różnią się algorytmy Kruskala i Prima?

Algorytm Kruskala jest zorientowany na krawędzie: sortuje każdą krawędź według wagi i zachłannie dodaje kolejną najtańszą krawędź, o ile nie tworzy ona cyklu, wykorzystując strukturę Union-Find do sprawdzania spójności. Algorytm Prima jest zorientowany na wierzchołki: zaczyna od jednego wierzchołka i zawsze rozszerza istniejące drzewo o najtańszą krawędź do nieodwiedzonego wierzchołka. Przeszukują graf w innej kolejności, ale dają ten sam optymalny wynik.

Co oznaczają kolory i etykiety?

Każda krawędź jest oznaczona swoją wagą całkowitą, obliczoną na podstawie odległości między jej dwoma wierzchołkami. Blade krawędzie nie zostały jeszcze przetworzone, żółte to bieżący kandydat, zielone zostały przyjęte do drzewa, a czerwone zostały odrzucone za tworzenie cyklu. W trybie Prim wypełnione zielone wierzchołki to te, które są już częścią rosnącego drzewa.

Dlaczego niektóre krawędzie są odrzucane w trybie Kruskala?

Kruskal rozpatruje krawędzie od najtańszej do najdroższej, ale dodanie krawędzi między dwoma już połączonymi wierzchołkami utworzyłoby cykl zamiast rozszerzyć drzewo. Struktura Union-Find wykrywa to w czasie niemal stałym, więc taka krawędź jest oznaczana jako odrzucona (czerwona) i pomijana, dzięki czemu wynik pozostaje poprawnym drzewem.

Czy oba algorytmy gwarantują ten sam wynik?

Oba zawsze dają minimalne drzewo rozpinające, więc suma wag jest identyczna. Gdy wszystkie wagi krawędzi są różne, samo MST jest jednoznaczne, co oznacza, że Kruskal i Prim wybierają dokładnie te same krawędzie. Jeśli niektóre wagi się powtarzają, wybrane krawędzie mogą się nieznacznie różnić, ale ogólna minimalna waga pozostaje taka sama.

Podobne symulacje