¿Cuál es una buena explicación para el algoritmo de componentes fuertemente conectados de Tarjan?

Un componente fuertemente conectado (SCC) en un gráfico dirigido es un ciclo o un vértice individual.

Aplicamos DFS en el gráfico y hacemos un seguimiento de dos propiedades para cada nodo en el árbol DFS producido:
1. Su tiempo (u orden) de ser descubierto por primera vez en DFS (por ejemplo, p1)
2. El orden del ancestro más antiguo que puede alcanzar (por ejemplo, p2)
Inicialmente, ambos son iguales para cada nodo.
Mientras que la primera propiedad permanece constante, la segunda puede actualizarse durante las llamadas recursivas DFS y usarse para encontrar bordes posteriores a los antepasados.
Para cualquier vértice si ambos son iguales después de llamadas DFS recursivas a todos sus vértices adyacentes, entonces es
1. Un vértice individual que no forma parte de ningún ciclo.
O
2. Parte de un ciclo y, por lo tanto, todo su descendiente (en el árbol DFS producido) puede alcanzarlo (no puede llegar a sus antepasados). En otras palabras, podemos comenzar y terminar en este nodo.
En el segundo caso, podemos hacer un seguimiento de todos los descendientes para imprimir.

esta animación ayuda a entender la explicación
(el primer entero es p1, el segundo es p2):

@File: Animación del algoritmo de Tarjan.gif

Explicación detallada e implementación de c ++:
El algoritmo de Tarjan para encontrar componentes fuertemente conectados – GeeksforGeeks

PD: este algoritmo es muy similar a encontrar puntos de articulación, puentes y gráficos biconéctados. Entonces, aprender esto primero puede ayudarlo a obtener una mejor intuición para el algoritmo.
http://www.geeksforgeeks.org/art…
http://www.geeksforgeeks.org/bri…

El algoritmo toma un gráfico dirigido como entrada y produce una partición de los vértices del gráfico en los componentes fuertemente conectados del gráfico. Cada vértice del gráfico aparece exactamente en uno de los componentes fuertemente conectados. Cualquier vértice que no esté en un ciclo dirigido forma un componente fuertemente conectado por sí mismo: por ejemplo, un vértice cuyo grado de entrada o salida es 0, o cualquier vértice de un gráfico acíclico.

La idea básica del algoritmo es esta: una búsqueda de profundidad primero comienza desde un nodo de inicio arbitrario (y las búsquedas de profundidad primero posteriores se realizan en cualquier nodo que aún no se haya encontrado). Como es habitual con la búsqueda de profundidad primero, la búsqueda visita cada nodo del gráfico exactamente una vez, y rechaza volver a visitar cualquier nodo que ya haya sido explorado. Por lo tanto, la colección de árboles de búsqueda es un bosque que abarca el gráfico. Los componentes fuertemente conectados se recuperarán como ciertos subárboles de este bosque. Las raíces de estos subárboles se denominan “raíces” de los componentes fuertemente conectados. Cualquier nodo de un componente fuertemente conectado podría servir como raíz, si resulta ser el primer nodo del componente descubierto por la búsqueda.

Algoritmo de componentes fuertemente conectados de Tarjan

More Interesting

¿Por qué un teórico de números esperaría que el número de primos gemelos menores que [matemática] N [/ matemática] sea 32 por ciento mayor que [matemática] N / (\ log (N) ^ 2) [/ matemática]?

¿Existe una prueba matemática para demostrar que no se pueden ejecutar algoritmos en [matemática] O \ left (\ frac {1} {n} \ right) [/ math]?

¿Por qué las matemáticas no son vistas como la prueba definitiva de una inteligencia detrás del universo, ya que las matemáticas se descubren, no se inventan?

¿De dónde sale esta prueba de inducción, alegando que no puede haber ningún cuestionario sorpresa?

¿Cuál es la prueba matemática de la ley de viscosidad de Newton?

Cómo demostrar que existen conjuntos finitos de matrices unitarias NXN [matemática] {U_i} [/ matemática] y probabilidades (que suman 1) [matemática] {p_i} [/ matemática] de cardinalidad igual para todas las matrices NXN [matemáticas] A [/ matemáticas], [matemáticas] \ sum_i p_i U_i A U_i ^ \ dagger = \ frac {tr (A)} {N} I [/ matemáticas]

Un típico juego de tres loterías tiene una recompensa de $ 500 en un boleto de $ 1 y la posibilidad de ganar es de 1 en 1000. ¿Muestra que la recompensa esperada es menor que 1?

Cómo convencer a las personas con pruebas matemáticas de que nada puede ir más rápido que la velocidad de la luz

¿Qué significa esta afirmación: ‘Por el teorema de Menger, para cada x, y hay k’ (G) aristas disjuntas por pares ‘?

¿Cuántas pruebas del teorema fundamental del álgebra hay?