Не уверен, есть ли лучший способ справиться с этим почти дубликатом GCJ - Гамильтоновы циклы , но вот мой ответ оттуда:
Решение на основе O (2 k ) использует принцип включения-исключения . Учитывая, что существует k запрещенных ребер, существует 2 k подмножеств этих ребер, включая набор сам и пустой набор. Например, если бы было 3 запрещенных ребра: {A, B, C}, было бы 2 3 = 8 подмножеств: {}, {A}, {B}, {C}, {A , B}, {A, C}, {B, C}, {A, B, C}.
Для каждого подмножества вы рассчитываете количество циклов, которые включают в себя по крайней мере все ребра в этом подмножестве. Если число циклов, содержащих ребра с , равно f (s) и S - это множество всех запрещенных ребер, тогда по принципу включения-исключения число циклов без каких-либо запрещенных ребер равно:
sum, for each subset s of S: f(s) * (-1)^|s|
где | с | количество элементов в с . Другими словами, сумма количества циклов с любыми ребрами минус количество циклов с хотя бы одним запрещенным ребром плюс число с хотя бы двумя запрещенными ребрами, ...
Расчет f (s) не тривиален - по крайней мере, я не нашел простой способ сделать это. Вы можете остановиться и подумать, прежде чем читать дальше.
Чтобы вычислить f (s) , начните с числа перестановок узлов, не связанных ни с одним s узлами. Если существует m таких узлов, существует m ! Перестановки, как вы знаете. Позвоните на номер перестановок c .
Теперь рассмотрим края в с для цепей. Если есть какие-либо невозможные комбинации, такие как узел с 3 ребрами или подцикл в пределах s , тогда f (s) это 0.
В противном случае для каждого приращения цепи м на 1 и умножить c на 2m . (Есть m мест для размещения цепочки в существующих перестановках, и коэффициент 2 объясняется тем, что цепочка может быть вперед или назад.) Наконец, f (s) - c / ( 2 м ). Последнее деление преобразует перестановки в циклы.