hdu5823】的更多相关文章

每种颜色的点集肯定是独立集,因此可以通过$O(2^n)$枚举每个集合判断出每个集合是否只需要一种颜色即可染色. 设$f[i][S]$表示$i$种颜色覆盖$S$这个集合的方案数,假定两个集合可以相交,那么最优解一定不相交,所以有$f[i][S]=\sum_{u\ or\ v=S}f[1][u]\times f[i-1][v]$,做$n$次FWT即可. 时间复杂度$O(2^nn^2)$. #include<cstdio> const int N=18,M=1<<N; int T,n,i…
听说3^n也能水过去.. 其实应该是个经典题,求图染色这个np问题. 把问题拆成独立集来进行dp可以在3^n之内水过去. 拆成独立集的时候就发现,等价与一个经典的反演dp问题 然后复杂度就变成了 n*n*2^n 另外,偷到一套头文件宏定义. #include <math.h> #include <time.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include…
官方题解:直接状压dp就行了,f[S]表示点集S的色数,枚举子集转移(子集是独立集).这样是3^n的. 这样就可以过了……(独立集就是点互相没有连边) 学到了一个穷举子集的简便写法 for (int j=i; j; j=(j-1)&i) #include<bits/stdc++.h> using namespace std; ],q[],n,t; ]; ][]; unsigned ]; void dfs(int i,int st,bool ff) { if (i==n) v[st]=f…