HDU - 5823:色II(DP状の圧力反転DP)

問題の意味:図の通信を考えるとは、色の数は、図のすべてのサブ接続グラフを決定しました。グラフ内の色の数は、隣接するエッジ間の点があるように、異なる色で染色された図に、色の最小数を意味します。

アイデアは:まず、アイデアは、私たちは与えられたマップのため、色が求めていないことが判明ことがわかっDFSを列挙して、色を計算するのですか?結局のところ、それは混乱無向グラフです。

  DP [S] =分(DP [S0] +1)、S0はSのサブセットであり、そして満足S ^ S0は独立に設定されている。次にDP考えます。だから、複雑さはO(3 ^ N)です。

そのため補体の、また反転DP使用することができますか?私が最初に会いました。良い食べ物は、ああ、私は修復する機会を持っています。

#include <ビット/ STDC ++ H>
 の#define UINT unsigned int型
 の#define担当者(iは、b)のための(iは= int型、iが= Bを<; I ++)は
 使用して 名前空間STDを、
const  int型 MAXN = 1000010 ;
チャー C [ 20 ] [ 20 ]。BOOL VIS [MAXN]。
INT Q [MAXN]、TOT、N。UINT DP [MAXN]。
ボイド検査(int型S)
{ 
    担当者(I、0、S)VIS [I] = 0、DP [I] = 1000000000 
    DP [ 0 ] = 0 ; 
    担当者(I、0、S){ 
        TOT = 0BOOL F = 1 
        担当者(j、0、N- 1であれば(I&(1 << J))Q [++ TOT = J。
        担当者(J、1 、TOT){
             場合(F!)ブレーク
            担当者(K、1 、TOT)
              もし(C [Q [J] [Q [k]は] == ' 1 ' ){ 
                F = 0破ります; 
            } 
        } 
        もし VIS(F)[I] = 1; 
    } 
} 
int型のmain()
{ 
    int型のT、S。
    scanf関数(" %のD "、&T)。
    一方、(T-- ){ 
        scanf関数(" %のD "、&​​N)。S =(1 << N) - 1 
        担当者(I、0、N- 1)のscanf(" %sの" 、C [I])。
        (S)をチェック。
        INT S = 1 ; S <= S; S ++ ){
             ためint型 I = sで;; I =(I- 1)&S){
                 場合(VIS [I ^ S]){ 
                  DP [S] =分(DP [S]、DP [I] + 1 )。
                } 
                もし(I == 0ブレーク
            } 
        } 
        UINT T = 1、ANS = 0 以下のためにint型 i = 1 ; iは= Sを<; iは++ ){ 
            T = T * 233 
            ANS + = T * DP [I]。
        } 
        COUT << ANS << ENDL。
    } 
    戻り 0; 
}

 

おすすめ

転載: www.cnblogs.com/hua-dong/p/11232341.html