2010-08-30 18 views
10

Tengo un gráfico cíclico dirigido. Comenzando por las hojas, deseo propagar los datos adjuntos a cada nodo en sentido descendente a todos los nodos a los que se puede acceder desde ese nodo. En particular, necesito seguir presionando los datos alrededor de cualquier ciclo que se alcance hasta que los ciclos se estabilicen.Recorrido de gráfico cíclico dirigido

Estoy completamente seguro de que se trata de un problema transversal de gráfico de valores. Sin embargo, estoy teniendo un poco de dificultad tratando de encontrar un algoritmo adecuado, creo que me faltan algunas palabras clave de búsqueda cruciales.

Antes de intentar escribir mi propio algoritmo O (n^3) a medias, ¿alguien puede indicarme una solución adecuada? ¿Y qué es llamado este problema en particular?

+0

Esto es probablemente algún tipo de problema de comunicación de difusión general (o de dispersión total). Podría ayudar si busca con estas palabras clave. – PeterK

+2

Quizás estas cosas estén claras para todos los demás, pero ¿qué quiere decir con comenzar en las hojas y propagar los datos en sentido descendente? ¿No sería una hoja un nodo sin nodos aguas abajo? Además, ¿qué significa para un ciclo estabilizarse? – ESRogs

+1

Creo que lo que llamo 'hojas' posiblemente se describiría más claramente como 'raíces', aunque dado que es un término gráfico cíclico, es particularmente intuitivo, me refiero a un nodo sin padres. Downstream está en la dirección de los niños. Debido a que el recorrido de un ciclo puede revelar más información que puede necesitar ser propagada a nodos ya visitados, es posible que algunos nodos deban ser visitados más de una vez, lo que significa que decidir cuándo terminar puede ser complicado; por lo tanto estabilización. De hecho, resulta que hay una manera mucho más fácil de hacer esto --- ver respuesta. –

Respuesta

19

Dado que el gráfico es cíclico (es decir, puede contener ciclos), primero lo dividiría en componentes fuertemente conectados. Un strongly connected component de un grafo dirigido es un subgrafo donde cada nodo es alcanzable desde cualquier otro nodo en el mismo subgrafo. Esto arrojaría un conjunto de subgrafos. Observe que un componente fuertemente conectado de más de un nodo es efectivamente un ciclo.

Ahora, en cada componente, cualquier información en un nodo eventualmente terminará en cada otro nodo del gráfico (ya que todos son accesibles). Por lo tanto, para cada subgráfico podemos simplemente tomar todos los datos de todos los nodos y hacer que cada nodo tenga el mismo conjunto de datos. No es necesario seguir los ciclos. Además, al final de este paso, todos los nodos en el mismo componente contienen exactamente los mismos datos.

El siguiente paso sería colapsar cada componente fuertemente conectado en un solo nodo. Como los nodos dentro del mismo componente tienen todos los mismos datos, y por lo tanto son básicamente los mismos, esta operación realmente no cambia el gráfico. El "super nodo" recién creado heredará todos los bordes que salen o que entran en los nodos del componente desde nodos fuera del componente.

alt text

Puesto que hemos colapsado todos los componentes fuertemente conectados, no habrá ciclos en la gráfica resultante (¿Por qué? Porque si hubiera habido un ciclo formado por los nodos resultantes, todos ellos se han colocado en el mismo componente en primer lugar). El gráfico resultante ahora es Directed Acyclic Graph. No hay ciclos, y un primer recorrido de profundidad simple desde todos los nodos con indegree = 0 (es decir, nodos que no tienen bordes entrantes), propagando datos de cada nodo a sus nodos adyacentes (es decir, sus "hijos"), debe hacer el trabajo .

+1

Perfecto. Esto también hace que muchos otros problemas en los que he estado trabajando sean mucho más tratables. ¡Gracias! –

Cuestiones relacionadas