Digamos que eu tenha um gráfico esparso finito não direcionado e precise executar as seguintes consultas com eficiência:
- - retornos T , se existir um caminho entre N 1 e N 2 , de outro modo F
- - retorna o conjunto dos nós que são acessíveis a partir de N
Isso é feito facilmente pré-computando os componentes conectados do gráfico. Ambas as consultas podem ser executadas no tempo .
Se também precisa de ser capaz de adicionar bordas arbitrariamente - -, em seguida, que pode armazenar os componentes em uma estrutura de dados disjuntos-conjunto . Sempre que uma aresta é adicionada, se conectar dois nós em componentes diferentes, eu mesclaria esses componentes. Isso adiciona custo O ( 1 ) a A d d E d g e e O ( I n v e r s e A c k custo de I s C o n n e c t e d e C o n n e c t e d N o d e s (o qual pode também ser O ( 1 ) ).
Se eu também precisar remover arestas arbitrariamente, qual é a melhor estrutura de dados para lidar com essa situação? Alguém é conhecido? Para resumir, ele deve oferecer suporte às seguintes operações com eficiência:
- - retornos T , se existir um caminho entre N 1 e N 2 , de outro modo F .
- - retorna o conjunto dos nós que são acessíveis a partir de N .
- - adiciona uma aresta entre dois nós. Observe que N 1 , N 2 ou ambos podem não ter existido antes.
- - remove uma aresta existente entre dois nós.
(Estou interessado nisso da perspectiva do desenvolvimento do jogo - esse problema parece ocorrer em várias situações. Talvez o jogador possa construir linhas de força e precisamos saber se um gerador está conectado a um prédio. Talvez o jogador possa bloquear e destrancar portas, e precisamos saber se um inimigo pode alcançar o jogador. Mas é um problema muito geral, então eu o expressei como tal)