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