Supongamos que tengo un gráfico disperso finito no dirigido y necesito poder ejecutar las siguientes consultas de manera eficiente:
- T N 1 N 2 F - retornos si existe un camino entre y , de lo contrario
- N : devuelve el conjunto de nodos a los que se puede acceder desde
Esto se hace fácilmente calculando previamente los componentes conectados del gráfico. Ambas consultas pueden ejecutarse en tiempo.
Si también necesito poder agregar bordes arbitrariamente ( , entonces puedo almacenar los componentes en una estructura de datos de conjunto disjunto . Cada vez que se agrega un borde, si conecta dos nodos en componentes diferentes, fusionaría esos componentes. Esto agrega el costo a y el costo a y (que también podría ser ).O ( 1 ) A d d E d g e O ( I n v e r s e A c k e r m a n n ( | N o d e s | ) ) I s C o n n e cC o n n e c t e d N o d e s O ( 1 )
Si también necesito poder eliminar bordes arbitrariamente, ¿cuál es la mejor estructura de datos para manejar esta situación? ¿Se conoce uno? Para resumir, debe soportar las siguientes operaciones de manera eficiente:
- - devuelve si existe un camino entre y , de lo contrario .N 1 N 2 F
- - devuelve el conjunto de nodos que son accesible desde .
- : agrega un borde entre dos nodos. Tenga en cuenta que , o ambos no podrían haber existido antes.
- : elimina un borde existente entre dos nodos.
(Estoy interesado en esto desde la perspectiva del desarrollo del juego: este problema parece ocurrir en bastantes situaciones. Tal vez el jugador pueda construir líneas eléctricas y necesitamos saber si un generador está conectado a un edificio. Tal vez el jugador pueda bloquear y desbloquear puertas, y necesitamos saber si un enemigo puede alcanzar al jugador. Pero es un problema muy general, así que lo he expresado como tal)