Najlepsza odpowiedź
Silnie powiązany komponent (SCC) na skierowanym wykresie to albo cykl lub pojedynczy wierzchołek.
Stosujemy DFS na wykresie i śledzimy dwie właściwości dla każdego węzła w wygenerowanym drzewie DFS: 1. Czas (lub kolejność) pierwszego odkrycia w DFS. ( powiedzmy p1) 2. Kolejność najstarszego przodka, do którego może dotrzeć (powiedzmy p2) Początkowo oba są takie same dla każdego węzła. Podczas gdy pierwsza właściwość pozostaje stała, druga może być aktualizowana podczas rekurencyjnych wywołań DFS i używana do znajdowania tylnych krawędzi do przodków. Dla dowolnego wierzchołka, jeśli oba są takie same po rekurencyjnych wywołaniach DFS do wszystkich sąsiednich wierzchołków, to jest to 1. Pojedynczy wierzchołek, który nie jest częścią żadnego cyklu. LUB 2. Część cyklu, a więc cały jego potomek (w wyprodukowanym drzewie DFS) może do niego dotrzeć (nie może dotrzeć do jego przodków). Innymi słowy, możemy zacząć i zakończyć w tym węźle. W drugim przypadku możemy śledzić wszystkie elementy potomne do wydrukowania.
ta animacja pomaga w zrozumieniu wyjaśnienia (pierwsza liczba całkowita to p1, druga to p2):
@ Plik: Animacja algorytmu Tarjana.gif
Szczegółowe wyjaśnienie i implementacja C ++: Tarjan „s Algorytm znajdowania silnie połączonych komponentów – GeeksforGeeks
PS: Ten algorytm jest bardzo podobny do znajdowania punktów artykulacji, mostów i dwupołączonych grafów. Dlatego nauczenie się ich w pierwszej kolejności może pomóc w lepszym zrozumieniu algorytmu. http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ http://www.geeksforgeeks.org/bridge-in-a-graph/
Odpowiedź
Algorytm przyjmuje skierowany graf jako dane wejściowe i tworzy podział wierzchołków grafu na silnie połączone komponenty grafu. Każdy wierzchołek wykresu pojawia się dokładnie w jednym z silnie powiązanych elementów. Każdy wierzchołek, który nie znajduje się w ukierunkowanym cyklu, sam tworzy silnie powiązany komponent: na przykład wierzchołek, którego stopień wejściowy lub wyjściowy wynosi 0, lub dowolny wierzchołek grafu acyklicznego.
Podstawowa idea algorytmu jest taka: przeszukiwanie w głąb zaczyna się od dowolnego węzła początkowego (a kolejne przeszukiwania w głąb są przeprowadzane na wszystkich węzłach, które nie zostały jeszcze znalezione). Jak zwykle w przypadku wyszukiwania w głąb, wyszukiwanie odwiedza każdy węzeł wykresu dokładnie raz, odmawiając ponownego odwiedzenia dowolnego węzła, który został już zbadany. Zatem zbiór drzew wyszukiwania jest lasem rozpiętym na wykresie. Silnie powiązane komponenty zostaną odzyskane jako pewne poddrzewa tego lasu. Korzenie tych poddrzew nazywane są „korzeniami” silnie połączonych komponentów. Każdy węzeł silnie połączonego komponentu może służyć jako główny węzeł, jeśli zdarza się, że jest pierwszym węzłem komponentu wykrytego podczas wyszukiwania.