Corrección del algoritmo de componentes fuertemente conectados para un gráfico dirigido

8

He estado leyendo sobre algoritmos para encontrar los componentes fuertemente conectados en un gráfico dirigido . Se considera buscar dos DFS y la segunda etapa se transpone el gráfico original .sol=(V,mi)solT

El algoritmo es el siguiente:

  1. Ejecute DFS en (comenzando en un vértice de inicio arbitrario), manteniendo un registro de los tiempos de finalización de todos los vértices.sol
  2. Calcule la transposición,
  3. Ejecute DFS en , comenzando en el vértice con el último tiempo de finalización, formando un árbol enraizado en ese vértice. Una vez que se ha completado un árbol, pasar al vértice no visitado con el siguiente última de acabado el tiempo y formar otro árbol usando DFS y repetir hasta que todos los vértices en son visitados.solTsolT
  4. Emite los vértices en cada árbol formado por el segundo DFS como un componente separado fuertemente conectado.

Mi pregunta es :

  1. ¿Cuál es la intuición detrás de este paso intermedio de calcular una transposición?
Friki
fuente

Respuestas:

10

Transposición de la matriz de adyacencia UNA hace

UNA[yo,j]=1UNAT[j,yo]=1.

En términos de gráficos, eso significa

tusolvvsolTtu.

En otras palabras, la transposición invierte la dirección de todos los bordes. Tenga en cuenta quesolT tiene los mismos componentes fuertes que sol.

El algoritmo que estás viendo es el algoritmo de Kosaraju . Tenga cuidado con su noción de "tiempo de finalización": no es el momento en que se visita el nodo, sino cuando la búsqueda ha atravesado el subgrafo accesible desde él. Wikipedia propone utilizar una pila para gestionar esto, lo que creo que es una buena idea.

¿Por qué es correcto usar solTintuitivamente? AsumirX es el primer nodo de su componente fuerte visitado por el DFS.

  • El DFS en sol atraviesa todo el componente fuerte de X después de alcanzar X, más algunos otros a través de bordes que salen del componente.
  • Como usamos un orden de pila para recordar el orden de los nodos, X es también el primer nodo de su componente fuerte visitado (como nodo inicial, incluso) en la segunda fase.
  • Ya que sol y solT tienen los mismos componentes fuertes, todos los nodos en el componente fuerte de X son visitados al buscar solT desde X. Esos bordes que dejan el componente en el primer punto de fase en la dirección incorrecta ensolTy por lo tanto no se siguen. Todos los bordes que salen del componente deX en solT ya se han eliminado debido al orden de la pila.
Rafael
fuente
2

Mi punto de vista:

Cuando ejecuta DFS en cualquier gráfico DAG y realiza un seguimiento de los tiempos de finalización, lo único que puede garantizar es que el nodo sumidero nunca obtendrá el mayor tiempo de finalización [1] . Pero al mismo tiempo, el tiempo de finalización más bajo puede aparecer en cualquier componente del gráfico . Por lo tanto, hace que el tiempo de finalización más bajo sea inútil.

Básicamente, el hecho [1] también es inútil en el gráfico original , pero es muy útil en el gráfico transpuesto . Cuando transpone, esta declaración lleva a lo siguiente:

En el gráfico transpuesto, el nodo que fue un sumidero en el gráfico no transpuesto siempre obtendrá el mayor tiempo de finalización .

hyahor
fuente