2010-12-15 29 views
6

Estoy trabajando en un algoritmo TopSort modificado y estoy teniendo problemas para encontrar/crear gráficos acíclicos dirigidos grandes (más de 1000 nodos) para usarlos en las pruebas. Tengo un gráfico de muestra no dirigido de otro proyecto que es de buen tamaño, pero tiene muchos ciclos. ¿Hay algún algoritmo que pueda usar para dirigir los bordes para que no haya ciclos?¿Cómo transformo un gráfico no dirigido y muy cíclico en un gráfico acíclico dirigido?

Respuesta

-1

Está buscando convertir el gráfico en un bosque de árboles enraizados. hacer un cruce de gráfico primero o primero de profundidad de cada componente del gráfico. Durante el recorrido, crea un borde dirigido entre los vértices padre-hijo.

ver http://en.wikipedia.org/wiki/Graph_traversal

+0

errm .. él no está tratando de hacer árboles. él quiere dirigir cada borde para que el gráfico resultante sea acíclico. y el método propuesto eliminará algunos bordes (creando así un árbol). – lijie

4

this proporciona una forma de obtener gráficos acíclicos. Básicamente, un cruce de gráfico produce un árbol, que define un orden parcial en los nodos originales. Luego, simplemente dirija todos los bordes para que apunten en una dirección consistente de acuerdo con el orden parcial, o estén entre 2 elementos que no están ordenados (estos pueden apuntar en cualquier dirección).

+0

No lo leí todo, pero a mi entender: la sección 2.1 de este documento describe una forma de convertir el gráfico dirigido a DAG (es decir, ciclos de interrupción). Y propone agregar un paso previo para convertir un gráfico dirigido a no dirigido a través de (cualquier) recorrido del gráfico. –

0

Para garantizar que el nuevo grafo dirigido esté conectado, ¿podría utilizar la búsqueda de primer orden de la siguiente manera?

old_undirected graph G 
new_directed graph D 
dequeue Q 
v is any node in G 
add v to D 
Q.push_back(v) 
while(Q is not empty): 
    v = Q.pop_front() 
    for all neighbors u to v: 
     if u in D 
       add edge u->v to D 
     else 
       add u to D and add edge v->u to D 
       Q.push_back(u) 

return D 

este gráfico debe contener todos los bordes de la gráfica original, pero el debe ser tan dirigido que no habrá ningún círculos.

Cuestiones relacionadas