Кто-нибудь знает алгоритм для следующей задачи:
Учитывая ненаправленный связный граф, найдите количество способов, которыми 2
отчетливые ребра могут быть обрезаны так, что график становится несвязным.
Я думаю, что частью проблемы (для которой я знаю алгоритм) является вычисление количества способов, которыми 1 линия может быть обрезана, чтобы она стала отключенной. Затем вычисление того, как они могут быть сгруппированы с другими строками, получает значение (M-K)*K + K*(K-1)/2
, M
= нет. ребер, K
= нет. из 1 порезов.
Часть, которую я не знаю, как сделать, это найти количество других способов вырезать 2 линии, например, на графике, который имеет только цикл 1 - 2 - 3 - 1
любая комбинация ребер является допустимым способом резки линии, чтобы отключить график.
Я закодировал часть программы, которая находит все срезы по 1 ребру, а затем разделил график на двусвязные компоненты, удалив эти ребра. Я пытался написать что-то для второй части, сделал для этого 2 версии, но ни одна из них не получила правильного ответа на каждый тест.
Дополнительная информация об этой задаче:
* Количество ребер <100 000
* Количество вершин <2000
* Программа должна работать максимум 2 секунды на любом графике с вышеуказанными ограничениями
* Между двумя вершинами может быть несколько ребер. </p>
Я могу сделать первую часть в O (N + M). Я предполагаю, что сложность для второй части должна быть максимальной O (N * M).