题目大意:给出n个点和m条边,求出图中恰好有k个连通图的方案数。

首先我们求出每个选择状态的连边方案数num,为了使枚举时不重复,

每次去掉最后一位lowbit( i ),只用包含这个点的连边情况转移。

然后求出保证这个状态只有1个联通块的方案数f,枚举所有状态

利用去掉最后一位lowbit( i )之后的状态s,枚举s的子集j,

i^j就代表了原状态i中不含j状态的情况,剩余的j状态的连边共有2的num[j]次幂种

利用f[i^j]这个原状态内部只有一个联通块的方案数 * 剩余的j状态的连边方案总数

就是在i状态中利用f[i^j]求出的不满足的方案数(因为这样就大于1个联通块了)。

dp数组代表i状态有j个联通块的情况数。

最后枚举状态,和状态的子集,即dp[i][q] = dp[ j ][q-1] * f[i - j ] (也可以写成i^j)

最后输出满状态的情况。

下面代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define mode 1000000009
using namespace std;
typedef long long ll;
ll num[(1<<16)+5];
ll f[(1<<16)+5];
ll dp[(1<<16)+5][16];
ll v[205];
int dis[16][16];
int lowbit(int x)
{return x & -x;
}
void init()
{memset(num,0,sizeof(num));memset(f,0,sizeof(f));memset(dp,0,sizeof(dp));memset(dis,0,sizeof(dis));
}
int n,m,k;
int gett(int x)
{int flag = 0;int cnt = 0;for(int i = 1;i <= n;i++){if((1<<(i-1))&x){flag = i;break;}}for(int i = 1;i <= n;i++){if((1<<(i-1))&x){if(dis[flag][i])cnt++;}}return cnt;
}
int main()
{int T;v[0] = 1;scanf("%d", &T);for(int i = 1;i <= 200;i++){v[i] = v[i-1]*2%mode;}for(int w = 1;w <= T;w++){scanf("%d%d%d", &n, &m, &k);init();for(int i = 1;i <= m;i++){int a,b;scanf("%d%d", &a, &b);dis[a][b] = dis[b][a] = 1;}for(int i = 1;i <= (1<<n)-1;i++){num[i] = num[i^lowbit(i)]+gett(i);}for(int i = 1;i <= n;i++){f[(1<<(i-1))] = 1;}for(int i = 1;i <= (1<<n)-1;i++){int s = i^lowbit(i);ll tt = 0;for(int j = s;j;(--j)&= s){tt += f[j^i]*v[num[j]]%mode;tt %= mode;}f[i] = ((v[num[i]]-tt)%mode+mode)%mode;}if(k==1){printf("Case #%d:\n%lld\n",w,f[(1<<n)-1]);continue;}for(int i = 0;i <= (1<<n)-1;i++){dp[i][1] = f[i];}for(int i = 1;i <= (1<<n)-1;i++){int s = i^lowbit(i);for(int j = s;j;(--j)&= s){for(int q = 2;q <= k;q++){dp[i][q] += dp[j][q-1]*f[i^j]%mode;dp[i][q] %= mode;}}}printf("Case #%d:\n%lld\n",w,dp[(1<<n)-1][k]);}return 0;
}

HDU 5713 状压dp相关推荐

  1. hdu 1074 状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:有n个作业,对于每一个作业有一个deadline,有一个完成这作业所需要的时间.如果超过d ...

  2. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  3. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  4. hdu 4640(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 思路:f[i][j]表示一个人状态i下走到j的最小花费,dp[i][j]表示i个人在状态j下的最 ...

  5. hdu 4539(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4539 思路:跟poj1185简直就是如出一辙! 1 #include<iostream> ...

  6. HDU 5045 状压DP 上海网赛

    比赛的时候想的是把n个n个的题目进行状压 但这样不能讲究顺序,当时精神面貌也不好,真是挫死了 其实此题的另一个角度就是一个n个数的排列,如果我对n个人进行状压,外面套一个按题目循序渐进的大循环,那么, ...

  7. hdu 4284(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4284 思路:类似于poj3311:http://poj.org/problem?id=3311,首先f ...

  8. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  9. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

  10. HDU 5691 Sitting in Line 状压dp

    Sitting in Line 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 Description 度度熊是他同时代中最伟大的数学家,一切 ...

最新文章

  1. SQL -- 是否或推断线相交以在其内部的平面
  2. 排序二叉树BST(binary search/sort tree)
  3. jquery插件之选项卡
  4. java基础----集合之Map集合基本方法的使用以及遍历
  5. 12张图带你彻底理解分布式事务产生的场景和解决方案!!
  6. [洪流学堂]Hololens开发入门篇1之模拟器开发环境配置
  7. RabbitMQ入门:主题路由器(Topic Exchange)
  8. 4家运营商、17家通信企业这样回应5G牌照发放
  9. python不好找工作怎么办信用卡_利用python进行信用卡欺诈检测
  10. vue-quill-editor 富文本 自定义图片上传操作
  11. 如何使域名跳转到个人博客
  12. supersu二进制更新安装失败_supersu 二进制更新解决方法
  13. HDUOJ 1847 Good Luck in CET-4 Everybody!
  14. root用户修改root密码提示The password fails the dictionary check
  15. kubectl认证 授权 准入控制
  16. Practice II 字符串
  17. 医院信息科结构化面试
  18. 《企业经营统计学》CH.4 企业产出统计分析
  19. 灵机一栋团队alpha冲刺 Ⅱ
  20. 阿德莱德大学语言班成绩为C,2020年阿德莱德大学语言班学习经历分享

热门文章

  1. linux穷举pppoe密码,Ubuntu/Linux下如何用rp-pppoe3.8通过ADSL上网
  2. vue项目报错[Vue warn]: Property “visible“ must be accessed with “$data.visible“ because properties start
  3. 放大镜旋转 css,css3中仿放大镜效果的几种方式原理解析
  4. 拍照时光圈与景深控制
  5. 理财学习02-基金误区
  6. Win7桌面为什么变黑了?Win10未激活
  7. mybatis的一级缓存和二级缓存
  8. 计算机保研面试题-数据结构
  9. 群发邮箱的软件哪个好?2021协议邮件群发软件推荐?
  10. BottomNavigationView--基本使用总结