不足している説明を指摘していただけると助かりますが、とにかく試してみます...
O(2 k ) ベースのソリューションでは、包含と除外の原則が使用されます。k 個の禁止エッジがあるとすると、セット自体と空のセットを含む、これらのエッジの2 k 個のサブセットがあります。たとえば、{A、B、C} の 3 つの禁止エッジがある場合、2 3 =8 個のサブセットがあります: {}、{A}、{B}、{C}、{A,B}、{A ,C}、{B,C}、{A,B,C}。
サブセットごとに、少なくともそのサブセットのすべてのエッジを含むサイクル数を計算します。エッジsを含むサイクルの数がf(s)であり、Sがすべての禁止エッジのセットである場合、包含除外原理により、禁止エッジを含まないサイクルの数は次のようになります。
sum, for each subset s of S: f(s) * (-1)^|s|
どこで | s | sの要素数です。別の言い方をすれば、任意のエッジを含むサイクル数の合計から、少なくとも 1 つの禁止エッジを含むサイクル数と少なくとも 2 つの禁止エッジを含むサイクル数を差し引いた数、...
f(s) の計算は簡単ではありません。少なくとも、簡単な方法は見つかりませんでした。読み進める前に、立ち止まって考えてみてください。
f(s)を計算するには、どのsノードにも関与しないノードの順列の数から始めます。そのようなノードがm個ある場合、 m個あります。ご存知のように順列。順列の数をcと呼びます。
次に、 sのエッジでチェーンを調べます。3 つのエッジに関係するノードやs内のサブサイクルなど、不可能な組み合わせがある場合、f(s)は 0 です。
それ以外の場合は、チェーンごとにmを 1 増やし、 cに2mを掛けます。(既存の順列にはチェーンを配置する場所がmあり、係数 2 は、チェーンが順方向または逆方向になる可能性があるためです。) 最後に、f(s)はc /( 2m ) です。最後の除算は順列をサイクルに変換します。