官方题解:直接状压dp就行了,f[S]表示点集S的色数,枚举子集转移(子集是独立集)。这样是3^n的。
这样就可以过了……(独立集就是点互相没有连边)
学到了一个穷举子集的简便写法
for (int j=i; j; j=(j-1)&i)
1 #include2 3 using namespace std; 4 int f[300010],q[20],n,t; 5 bool v[300010]; 6 char a[20][20]; 7 unsigned int d[300010]; 8 9 void dfs(int i,int st,bool ff)10 {11 if (i==n) v[st]=ff;12 else {13 dfs(i+1,st,ff);14 if (ff)15 {16 for (int j=1; j<=t; j++)17 if (a[q[j]][i]=='1') {ff=0;break;}18 }19 q[++t]=i;20 dfs(i+1,st|(1<