skrydg's blog

By skrydg, history, 9 years ago, In Russian

Есть задачка:

http://acm.timus.ru/problem.aspx?space=1&num=1557

В ней нужно подсчитать кол-во способов удалить два различных ребра из связного графа, чтобы он перестал быть связным.

В комментариях я прочитал, что можно это сделать за n + m.

Я научился делать только за n * n.

Мое решение:

Рассмотрим дерево обхода dfs. Ребра разбились на 2 типа.(прямые и обратные)

Удалять 2 обратных нет смысла(Граф останется связным).

Удаляем прямое ребро и обратное. Это можно сделать, как при поиске мостов, только поддерживаем не только самую высокую ссылку на верх, а еще и вторую по высоте.

Удаляем 2 прямых ребра. Здесь мы просто перебираем два прямых ребра и смотрим разбился граф на два или нет.(Это делается, опять же при помощи поддержания нужных ссылок на верх.)

Это краткое описание моего решения. Но как делать быстрее?

  • Vote: I like it
  • +5
  • Vote: I do not like it