hdu 5823(状压DP)
来源:互联网 发布:html商城模板源码 编辑:程序博客网 时间:2024/06/10 19:17
题意:给出无向图,然后找出给它的各个非空子图染色的最小值,染色要求一条边相邻的两个点的颜色不一样。
思路:独立集是一个所有的点都不相连的点集。它的最小染色为1.
用独立集去更新它的全集;
#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;typedef long long ll;const int maxn = 10 + 10;#define INF 0x3f3f3f3f#define clr(x,y) memset(x,y,sizeof x)const ll Mod = (ll)1 << 32;typedef pair<int,int> P;char g[maxn][maxn];int dp[1 << maxn];int flag[1 << maxn];//记录是否是独立集int main(){ int T; scanf("%d",&T); while(T --) { int n; scanf("%d",&n); for(int i = 0; i < n; i ++) scanf("%s",g[i]); int N = (1 << n); for(int S = 1; S < N; S ++) { flag[S] = true; for(int i = 0; i < n; i ++)if( (1 << i) & S) { for(int j = 0;j < n; j ++) if( (1 << j) & S && g[i][j] == '1') { flag[S] = false; break; } if(!flag[S]) break; } } dp[0] = 0; for(int i = 1; i < N; i ++)//i ^ j 为当 i为全集的时候j的补集 { dp[i] = 10; for(int j = i; j ; j = (j - 1) & i)//枚举i的子集 { if(flag[j]) dp[i] = min(dp[i],dp[i ^ j] + 1); } } ll ans = 0; ll temp = 1; for(int i = 1; i < N; i ++) { temp = temp * 233 % Mod; ans = (ans + dp[i] * temp % Mod) % Mod; } printf("%I64d\n",ans); } return 0;}
阅读全文
0 0
- hdu 5823(状压DP)
- HDU 5823 color II(状压DP)
- HDU 5823 color 状压DP
- hdu 3001(状压dp)
- hdu 2686(状压dp)
- hdu 2809(状压dp)
- hdu 4640(状压dp)
- hdu 3182(状压dp)
- HDU 5823 color II (状压dp -- 图的染色)
- [状压DP] HDU 5823 Color II
- HDU 1074 Doing Homework (状压+DP) 初学dp笔记
- hdu 5823(壮压dp)
- HDU 4284--Travel(状压dp+TSP)
- hdu 4804 Campus Design (状压dp)
- hdu 3001(状压dp, 3进制)
- HDU 4856 Tunnels(BFS+状压DP)
- hdu 1074 Doing Homework (状压dp)
- HDU 3001Travelling (状压DP)
- SVN使用教程
- UOJ #82 [UR #7] 水题生成器
- 优雅的让Fragment整合到ViewPager中
- uva509 RAID
- hdu 1728 逃离迷宫
- hdu 5823(状压DP)
- 音乐播放器
- python中文字符截取乱码
- Android Git 笔记
- Android实现可左右滑动的选择控件
- java导出jar包以及jar内程序读取jar包外配置文件
- Win7下安装Python和Python IDLE
- npm常用命令整理
- 面试题:C++实现一个不能被继承的类