2009-05-08 12 views
9

I tiene una geométrico no dirigido planar graph, que es una gráfica donde cada nodo tiene un lugar y no transversal 2 bordes, y que desee encontrar todos los ciclos que no tienen bordes que cruzan ellos.pequeño hallazgo ciclo en un grafo plano

¿Hay alguna buena solución conocida para este problema?


Lo que estoy pensando en hacer es una especie de A* como solución:

  • inserto cada arista en un montón min como un camino
  • extender el camino más corto con cada opción
  • rutas de descarte que vuelven a iniciarse en otro lugar que no sea el inicio (podría no ser necesario)
  • rutas de descarte que serían el tercero en usar un borde dado

¿Alguien ha visto un problema con esto? ¿Funcionará?

+2

Entonces, ¿qué estás buscando es el límite de cada cara? – user57368

+0

Yah. – BCS

+1

¿Es esto un gráfico dirigido o no dirigido? – bdonlan

Respuesta

10

Mi primer instinto es utilizar un método similar a un solucionador de wall following laberinto. Esencialmente, sigue los bordes y siempre saca el borde derecho de un vértice. Cualquier ciclo que encuentre con este método será límites de una cara. Deberá hacer un seguimiento de los bordes que ha recorrido en esa dirección. Una vez que ha atravesado un borde en ambas direcciones, ha identificado las caras que separa. Una vez que todos los bordes se han recorrido en ambas direcciones, habrá identificado todas las caras por sus límites.

+0

+1. Explotación perspicaz de la planaridad –

+1

Buena solución. El único truco real que puedo ver es determinar "más a la derecha". Sin embargo, desde la ubicación Es sabido que entonces podría usar el análogo 2D del producto cruzado para probar todas las salidas posibles para ver cuál forma el ángulo más pequeño (en sentido antihorario) con el borde actual. – Naaff

+1

@Naaff, tome todos los ángulos salientes, restelos del ángulo de borde en el que llegó, mod 2 * pi, tome el más pequeño – BCS

5

un "borde de cruce", como usted lo llama, se conoce generalmente como un chord. Por lo tanto, tu problema es encontrar todos los ciclos sin acordes.

This paper parece que puede ayudar.

+0

Eso suena bien, no sabía aplicar el "cordón" fuera de los círculos. – BCS

+0

¿Alguna idea de dónde puedo descargarla? Mi cuenta de la universidad (que tiene acceso a todo y es un perro) ni siquiera parece tener acceso. – BCS

+0

¿Se puede acceder a través de ScienceDirect? http://dx.doi.org/10.1016/j.jda.2007.01.005 No encuentro ninguna copia disponible gratuitamente. O siempre puedes intentar enviar un correo electrónico al autor y pedirle una copia. Si eres adecuadamente educado, es posible que se alegre de enviártelo. O, diablos, podrías ver si tu biblioteca de la universidad obtiene el diario. –

2

Una manera simple de hacer esto es simplemente salir y enumerar cada cara. El principio es simple:

  • Nos mantener 'a-visitado' y banderas 'visitado ß-' para cada borde, y un par de listas enlazadas doblemente de bordes no visitados para cada uno de tales bandera. La división 'α' y 'β' debe corresponder a una partición del plano en la línea correspondiente al borde en cuestión; qué lado es α y qué lado es β es arbitrario.
  • Para cada vértice V:
    • Para cada par adyacente de bordes E = (V_1, V), E '= (V_2, V) (es decir, ordenar por ángulo, tomar pares adyacentes, así como primero + último):
    • Determine en qué lado se encuentra S de E (S = α o β) V_2.
    • Caminar la baldosa, a partir de V, con el lado S de E, como se describe a continuación:

Corta la baldosa se realiza por:

  • Let V = V_init
  • Bucle:
    • V_next = el vértice de E que no es V
    • E '= El borde adyacente a E desde V_next que está en el lado actual de E
    • S' = El lado de E 'que contiene V
    • Si V_next = V, hemos encontrado un bucle; registre todos los bordes que pasamos en el camino, y marque esos pares de bordes como visitados.
    • Si E '= E (solo hay un borde), entonces llegamos a un callejón sin salida; abortar esta caminata
    • De lo contrario, deje V = V_next, E = E ', S = S' y continúe.

espero que esto tenía sentido; tal vez necesite algunos diagramas para explicar ...

+0

Cuando dice "E" = El borde adyacente a E desde V_next que está en el lado actual de E ": Creo que podría haber múltiples bordes E 'que satisfagan t su condición, ¿correcto? Además, cuando dice "Si V_next = V, hemos encontrado un bucle", ¿quiere decir "If V_next = V_init, hemos encontrado un bucle"? –

+0

En realidad, pensándolo mejor, creo que esta es una respuesta desconocida (google) explicada de una forma mucho más enrevesada: eso es lo que obtengo al responder cuando estoy cansado: / – bdonlan

Cuestiones relacionadas