問題CF53E] [行き止まりへのソリューション

質問の意味:

  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 ; 
}

 

おすすめ

転載: www.cnblogs.com/tonyshen/p/11628151.html