Supponiamo che io abbia un grafico sparso finito non indirizzato e che debba essere in grado di eseguire in modo efficiente le seguenti query:
- - restituisce se esiste un percorso tra e , altrimentiN 1 N 2 F
- : restituisce il set di nodi che sono raggiungibili da
Questo è facilmente eseguibile pre-calcolando i componenti collegati del grafico. Entrambe le query possono essere eseguite in .
Se devo anche essere in grado di aggiungere arbitrariamente i bordi - - allora posso memorizzare i componenti in una struttura di dati disgiunta . Ogni volta che viene aggiunto un bordo, se collega due nodi in componenti diversi, unirei quei componenti. Ciò aggiunge il costo a e a e (che potrebbe anche essere 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 c t e d C o n n e c t e d N oO ( 1 )
Se devo anche essere in grado di rimuovere arbitrariamente i bordi, qual è la migliore struttura di dati per gestire questa situazione? Uno è noto? Riassumendo, dovrebbe supportare in modo efficiente le seguenti operazioni:
- T N 1 N 2 F - restituisce se esiste un percorso tra e , altrimenti .
- N - restituisce l'insieme dei nodi che sono raggiungibili da .
- : aggiunge un bordo tra due nodi. Nota che , o entrambi potrebbero non esistere prima.N 2
- : rimuove un bordo esistente tra due nodi.
(Sono interessato a questo dal punto di vista dello sviluppo del gioco - questo problema sembra verificarsi in parecchie situazioni. Forse il giocatore può costruire linee elettriche e dobbiamo sapere se un generatore è collegato a un edificio. Forse il giocatore può bloccare e sbloccare le porte, e dobbiamo sapere se un nemico può raggiungere il giocatore. Ma è un problema molto generale, quindi l'ho definito come tale)