問題の意味:図の通信を考えるとは、色の数は、図のすべてのサブ接続グラフを決定しました。グラフ内の色の数は、隣接するエッジ間の点があるように、異なる色で染色された図に、色の最小数を意味します。
アイデアは:まず、アイデアは、私たちは与えられたマップのため、色が求めていないことが判明ことがわかっ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 = 0。BOOL 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; }