Блог пользователя KaiZeR

Автор KaiZeR, 14 лет назад, По-русски

Подскажите пожалуйста возможно ли в системе непересекающихся множеств реализовать разъединение множеств не теряя при этом выигрыша во времени (например не отказываясь от использования эвристики сжатия путей).

Теги dsu
  • Проголосовать: нравится
  • +7
  • Проголосовать: не нравится

»
14 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +3 Проголосовать: не нравится

можно делать откаты: запоминать изменения, а затем делать их в обратном порядке.

почитай вот этот тред, там в моих сообщения объясняется как это делать. и там же есть ссылка на код

»
14 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится
У меня одного оформление поста кривое показывается (комментарии справа от серой линии)?
»
14 лет назад, скрыть # |
 
Проголосовать: нравится +9 Проголосовать: не нравится
Еще есть реализация DSU на списках. при слиянии множеств запихивваешь содержимое меньшего списка в больший. крускал при такой реализицаии в худшем случае за N Log N заботает. Вместо списков можно юзать мапы/хешмапы, тогда можно будет за размер меньшего подмножества расщеплять множества произвольным образом, а не откатываясь к предыдущему состоянию.
»
14 лет назад, скрыть # |
 
Проголосовать: нравится +12 Проголосовать: не нравится
Следующая задача легко решается за время O(log n) на операцию. У нас есть n вершин, мы можем добавлять ребра между ними и удалять, но так, чтобы все время был лес. Еще надо уметь отвечать на запросы "в одной ли компоненте связности лежат две заданные вершины". Вроде, это то, что нужно?