Если вместо просто «освещенных» или «неосвещенных» вы сохранили бы набор узлов, от которых узел запитывается или освещается, и рассматривали узел с пустым набором как «неосвещенный», а узел с непустым набором — как « горит», то удаление ребра будет означать просто удаление исходного узла из набора целевых узлов.
РЕДАКТИРОВАТЬ: Забыл это: и если вы удалите последний освещенный узел в наборе, пройдите по краям и удалите узел, который вы только что «не зажгли» из их набора (и, возможно, тоже пересечете его и т. д.)
РЕДАКТИРОВАТЬ2 (перефразировать для тафа): Во-первых: я неправильно понял исходный вопрос и подумал, что в нем говорилось, что для каждого узла уже известно, горит он или нет, что, как я перечитал сейчас, не упоминалось.
Однако, если для каждого узла в вашей сети вы храните набор, содержащий узлы, через которые он был освещен, вы можете легко пройти по графу от удаленного ребра и исправить любые освещенные/неосвещенные ссылки. Так, например, если у нас есть узлы A, B, C, D, как это: (хромая попытка ascii-арта)
A -> B >- D
\-> C >-/
Затем в узле A вы сохраните, что это был источник (и, следовательно, освещенный сам по себе), и в B, и в C вы сохраните, что они были освещены A, а в D вы сохраните, что он был освещен как A, так и C. .
Затем скажем, что мы удаляем ребро из B в D: В D мы удаляем B из списка освещенных источников, но он остается освещенным, поскольку он все еще освещается A. Далее, скажем, мы удаляем ребро из A в C после этого: A удаляется из набора C, и, таким образом, C больше не горит. Затем мы переходим по ребрам, исходящим из C, и удаляем C из набора D, который теперь также не освещен. В этом случае мы закончили, но если бы набор был больше, мы бы просто продолжили с D.
Этот алгоритм будет когда-либо посещать только те узлы, на которые непосредственно влияет удаление или добавление ребра, и поэтому (за исключением дополнительного хранилища, необходимого на каждом узле) он должен быть близок к оптимальному.
person
Frans-Willem
schedule
05.01.2009