Beste antwoord
Een sterk verbonden component (SCC) in een gerichte graaf is ofwel een cyclus of een individueel hoekpunt.
We passen DFS toe op de grafiek en houden twee eigenschappen bij voor elk knooppunt in de geproduceerde DFS-boom: 1. De tijd (of volgorde) van de eerste ontdekking in DFS. ( zeg p1) 2. De volgorde van de oudste voorouder die het kan bereiken. (zeg p2) Aanvankelijk zijn beide hetzelfde voor elk knooppunt. Hoewel de eerste eigenschap constant blijft, kan de tweede worden bijgewerkt tijdens recursieve DFS-aanroepen en worden gebruikt om achterranden naar voorouders te vinden. Voor elk hoekpunt als beide hetzelfde zijn na recursieve DFS-aanroepen naar alle aangrenzende hoekpunten, is het 1. Een individueel hoekpunt dat geen deel uitmaakt van een cyclus. OF 2. Deel van een cyclus en dus al zijn afstammelingen (in DFS-boom geproduceerd) kan het bereiken (kan zijn voorouders niet bereiken). Met andere woorden, we kunnen beginnen en eindigen bij dit knooppunt. In het tweede geval kunnen we alle afstammelingen bijhouden om af te drukken.
deze animatie helpt bij het begrijpen van de uitleg (eerste gehele getal is p1, tweede is p2):
@ Bestand: Tarjans Algorithm Animation.gif
Gedetailleerde uitleg en c ++ implementatie: Tarjan “s Algoritme om sterk verbonden componenten te vinden – GeeksforGeeks
PS: dit algoritme lijkt erg op het vinden van articulatiepunten, bruggen en biconnected grafieken. Dus als u deze eerst leert, kunt u een betere intuïtie voor het algoritme krijgen. http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ http://www.geeksforgeeks.org/bridge-in-a-graph/
Antwoord
Het algoritme neemt een gerichte graaf als invoer en produceert een verdeling van de hoekpunten van de graaf in de sterk verbonden componenten van de graaf. Elk hoekpunt van de grafiek verschijnt in precies een van de sterk verbonden componenten. Elk hoekpunt dat niet op een gerichte cyclus ligt, vormt op zichzelf een sterk verbonden component: bijvoorbeeld een hoekpunt waarvan de in-graad of uit-graad 0 is, of elk hoekpunt van een acyclische graaf.
De basisidee van het algoritme is dit: een diepte-eerst-zoekactie begint vanaf een willekeurig startknooppunt (en daaropvolgende diepte-eerst-zoekacties worden uitgevoerd op alle knooppunten die nog niet zijn gevonden). Zoals gebruikelijk bij diepte-eerst zoeken, bezoekt de zoekopdracht elk knooppunt van de grafiek precies één keer, en weigert om een knooppunt opnieuw te bezoeken dat al is onderzocht. De verzameling zoekbomen is dus een overspannen bos van de grafiek. De sterk verbonden componenten worden hersteld als bepaalde substructuren van dit forest. De wortels van deze subbomen worden de “wortels” van de sterk verbonden componenten genoemd. Elk knooppunt van een sterk verbonden component zou kunnen dienen als de root, als het toevallig het eerste knooppunt is van de component die ontdekt wordt door de zoekopdracht.