Hvad er en god forklaring på Tarjans stærkt forbundne komponentalgoritme?


Bedste svar

En stærkt forbundet komponent (SCC) i en rettet graf er enten en cyklus eller et individuelt toppunkt.

Vi anvender DFS på grafen og holder styr på to egenskaber for hver node, der produceres i DFS-træ: 1. Dens tid (eller rækkefølge) for først at blive opdaget i DFS. ( siger p1) 2. Rækkefølgen af ​​den ældste forfader, den kan nå. (sig p2) Oprindeligt er begge ens for hver node. Mens 1. egenskab forbliver konstant, kan den anden opdateres under rekursive DFS-opkald og bruges til at finde bagkanter til forfædre. For ethvert toppunkt, hvis begge er ens efter rekursive DFS-opkald til alle dets tilstødende hjørner, er det enten 1. Et individuelt toppunkt, der ikke er en del af en cyklus. ELLER 2. En del af en cyklus, så al dens efterkommere (i DFS-træ produceret) kan nå den (kan ikke nå ud til sine forfædre). Med andre ord kan vi starte fra og slutte ved denne node. I 2. tilfælde kan vi holde styr på alle de efterkommere, der skal udskrives.

denne animation hjælper med at forstå forklaringen (første heltal er p1, andet er p2):

@ Fil: Tarjans Algorithm Animation.gif

Detaljeret forklaring og c ++ implementering: Tarjan “s Algoritme til at finde stærkt forbundne komponenter – GeeksforGeeks

PS: Denne algoritme svarer meget til at finde artikulationspunkter, broer og toforbundne grafer. Så at lære disse først kan hjælpe dig med at få bedre intuition til algoritmen. http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ http://www.geeksforgeeks.org/bridge-in-a-graph/

Svar

Algoritmen tager en rettet graf som input og producerer en deling af grafens hjørner i grafens stærkt forbundne komponenter. Hvert toppunkt i grafen vises i nøjagtigt en af ​​de stærkt forbundne komponenter. Ethvert toppunkt, der ikke er på en rettet cyklus, danner en stærkt forbundet komponent i sig selv: for eksempel et toppunkt, hvis ind- eller udgrad er 0, eller et hvilket som helst toppunkt i en acyklisk graf.

grundlæggende idé om algoritmen er denne: en dybde-første søgning begynder fra en vilkårlig startknude (og efterfølgende dybde-første søgninger udføres på alle noder, der endnu ikke er fundet). Som sædvanlig med dybde-første søgning besøger søgningen hver node i grafen nøjagtigt en gang og afviser for at revidere enhver node, der allerede er blevet udforsket. Således er samlingen af ​​søgetræer en spændende skov i grafen. De stærkt tilsluttede komponenter vil blive gendannet som visse undertræer i denne skov. Rødderne til disse undertræer kaldes “rødderne” til de stærkt forbundne komponenter. Enhver knude på en stærkt tilsluttet komponent kan tjene som rod, hvis det tilfældigvis er den første knude på komponenten, der bliver opdaget ved søgningen.

Tarjans stærkt forbundne komponentalgoritme

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *