Скажем, у меня есть неориентированный конечный разреженный граф, и мне нужно эффективно выполнять следующие запросы:
- - возвращает если есть путь между и N_2 , в противном случае FН 1 Н 2 F
- - возвращает набор узлов, которые доступны из
Это легко сделать, предварительно вычислив подключенные компоненты графа. Оба запроса могут быть выполнены за раз.
Если мне также нужно иметь возможность добавлять ребра произвольно - - тогда я могу хранить компоненты в структуре данных с несвязным множеством . Всякий раз, когда добавляется ребро, если оно соединяет два узла в разных компонентах, я бы объединял эти компоненты. Это добавляет стоимость стоимости и к и (которые также могут быть ).
Если мне также нужно иметь возможность произвольно удалять ребра, какова лучшая структура данных, чтобы справиться с этой ситуацией? Один известен? Подводя итог, он должен эффективно поддерживать следующие операции:
- - возвращает , если существует путь между и , в противном случае .
- - возвращает набор узлов , которые доступны из .
- - добавляет ребро между двумя узлами. Обратите внимание, что , или оба, возможно, не существовали раньше.
- - удаляет существующее ребро между двумя узлами.
(Я заинтересован в этом с точки зрения разработки игры - эта проблема, по-видимому, возникает в довольно многих ситуациях. Возможно, игрок может построить линии электропередачи, и нам нужно знать, подключен ли генератор к зданию. Возможно, игрок может заблокировать и откройте двери, и нам нужно знать, сможет ли враг добраться до игрока. Но это очень общая проблема, поэтому я сформулировал это так)