質問の意味:
N(N <= 10)に、図のMエッジへのノードを持っていない、図内側、スパニング、エッジをm個のスパニングツリーを構築するためにのみ、すべての次数k-1は、プログラムのポイントの数であることを必要とします。
ソリューション:
大きさの順は確かに圧縮DPの状態を考えます参照してください...
それでは、デザインの状態を見てみましょう:
DP [I] [j]はスパニングツリー状態がIであり、番組Jに含まれる点の度合いは状態の数です。
トランジション、およびすべての時間を述べることができるその後の更新の2つの方法があります。
1:置換度1相当の原点にエッジ(すなわち新しい点)を追加します。
2:度はノード1の片面に塗布されていません。
時間計算:
O(生きることができます)
コード上のがらくたをカット:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INTの MAXS =(1 << 11)+ 10 。 ベクター < INT > MAPP [ 20 ]。 int型DP [MAXS] [MAXS]、[MAXS] CNT1。 INTのN、M、K。 無効INITを(){ ため(int型 Iを= 1 ; I <= MAXS; I ++ ) のための(INT K = 0 ; K <+ 15 ; ++ k個) であれば(I&(1 << k))を CNT1 [I] ++ ; } int型のmain(){ INIT()。 scanf関数(" %D%D%D "、&N、&M、およびK); INT X、Y。 以下のために(int型私= 1 ; I <= M; iが++ ){ scanf関数(" %D%D "、およびX&Y)。X - ; y-- ; MAPP [X] .push_back(Y); MAPP [Y] .push_back(X)。 } のために(int型 i = 1 ; iが=(< 1 << N) - 1 ; I << = 1)DP [i]は[I] = 1 。 ために(int型 i = 1 ; iが=(< 1 << n)を- 1 ; iは++ ) のために(INT J = I; J; - J&= i)が あれば(DP [I] [J]) のための(INT E = 0 ; E ++; E <N ) であれば(I&(1 << E)) のための(INT R = 0 ; R <MAPP [E] .size(); R ++ ){ int型 =に[E] MAPP [R]、今; もし(〜I&(1 <<{))の 場合(CNT1 [I] == 1)今= I |(1 << )であり; 他の今= J&〜(1 << E)|(1 << まで)。 もし(!(今>>まで+ 1))DP [I |(1 <<へ)] [今] + = DP [I] [J]。 } } 長い 長のANS = 0 。 以下のために(int型 i = 0 ; iが=(< 1つの)<< N - 1 ; iは++ ) 場合(CNT1 [I] == k)は ANS + = DP [(1 << N) - 1 ] [i]は、 printf(" %のLLD " 、ANS)。 リターン 0 ; }