Проверка подключения:
Ваш график направлен ациклично, поэтому вы можете предварительно обработать и найти Paths = { (u,v) | there is a path from u to v }
.
После удаления / добавления каждого ребра (u,v)
все, что вынужно сделать это сброс Paths
соответственно.Обратите внимание, что для каждого v'
, (u,v')
находится в Paths
тогда и только тогда, когда существует u'
, такое, что (u,u')
все еще является ребром в вашем графике, а (u',v')
находится в Paths
.
Не забудьте рекурсивно вызывать модификацию Paths
для каждого из родителей u
.
Хотя это решение не лучше, чем BFS в худшем случае, оно должно быть лучше в среднем случае - поскольку вам не нужно исследовать весь график после каждого изменения.
Редактировать:пример
Например, на вашем графике Path={(1,2),(1,3),(1,4),(2,4),(3,4)}
- есть путь ко всем вершинам ко всем "прямым" вершинам, кроме от 2 до 3.
Теперь, если вы удалите ребро (1,4)
, выget Path={(1,2),(1,3),(1,4),(2,4),(3,4)}
Обратите внимание, что (1,4)
все еще там, потому что есть ребро (1,2) и (2,4) в Path
.
Теперь удалите (2,4)
, это приведет к: Path={(1,2),(1,3),(1,4),(3,4)}
.Опять же, (1,4)
по-прежнему в, потому что (1,3)
по-прежнему край, а (3,4)
в Path
.
Теперь удалите (3,4)
.От 3
до 4
не осталось пути, поэтому вы удалите (3,4)
.Теперь рекурсивно измените всех родителей 3
.Поскольку 1
является родителем 3
, вызовите его для него, и вы обнаружите, что больше нет ребер (1,u)
, так что (u,4)
все еще находится в пути, поэтому мы удаляем его из Path
, в результате чегоPath={(1,2),(1,3)}
.
Поиск набора ребер для удаления:
Я бы начал с удаления всех ребер и добавил ребра вместо их удаления.Вы можете добавить только ребро, которое не связывает график.При таком подходе вы пытаетесь максимизировать значение добавляемых ребер вместо минимизации удаляемых ребер.
Тем самым вы гарантируете, что ваше решение выполнимо , а график действительно не подключен.