要进行两次dp,

第一个,dp[i],1<=i<=(1<<n)

其中用i的二进制形式表示已选择的点。

dp[i] 用来保存i中的点构成一个连通块,边集多少种可能。

转移方程:

        save[0] = 1;//这里用save[i]表示dp[i]for(int i=1;i<(1<<n);i++){int ti = i-lowbit(i); //一定选择最后一个点,使之有序int j = ti;long long tmp=0;//问题转化为对立问题,记录有多少不连通边集的情况,all[i]表示i中的点,边集的所有可能情况。for(;j>0;j=(j-1)&ti){tmp += save[i-j]*all[j];tmp %= MOD;}save[i] = (all[i]-tmp+MOD)%MOD;}    

第二次dp,套路基本相同。

dp[i][j] 表示恰有(i+1)个连通块,且含j中的点的所有可能。

转移方程:

     for(int i=1;i<kk;i++){for(int j=1;j<(1<<n);j++){int tj= j-lowbit(j);for(int k=tj; k>0;k = (k-1)&tj ){dp[i][j] += dp[i-1][k]*save[j-k];dp[i][j] %= MOD;}}}

//
//  main.cpp
//  Astar160529
//
//  Created by 陈加寿 on 16/5/29.
//  Copyright © 2016年 chenhuan001. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;#define MOD 1000000009long long dp[15][1<<14];
int mat[15][15];
long long save[1<<14];
long long s2[500];
long long all[1<<14];int lowbit(int x)
{return x&(-x);
}void test()
{int cnt=0;for(int i=0;i<(1<<14);i++){for(int j=i;j>0;j=(j-1)&i){cnt++;}}cout<<cnt<<endl;cout<<(1<<28)<<endl;
}int main() {s2[0] = 1;for(int i=1;i <= 14*14;i++)s2[i] = (2*s2[i-1])%MOD;//test();int T;cin>>T;int tt=1;while(T--){int kk,n,m;scanf("%d%d%d",&n,&m,&kk);int cnt0=0;memset(mat,0,sizeof(mat));for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);a--; b--;if(a==b) cnt0++;else{mat[a][b] = mat[b][a] = 1;}}memset(save,0,sizeof(save));memset(all,0,sizeof(all));memset(dp,0,sizeof(dp));for(int i=0;i<(1<<n);i++){int tcnt=0;for(int j=0;j<n;j++){if( ((1<<j)&i) !=0){for(int k=j+1;k<n;k++){if( ((1<<k)&i) !=0 ){tcnt += mat[j][k];}}}}all[i] = s2[tcnt];}save[0] = 1;for(int i=1;i<(1<<n);i++){int ti = i-lowbit(i);int j = ti;long long tmp=0;for(;j>0;j=(j-1)&ti){tmp += save[i-j]*all[j];tmp %= MOD;}save[i] = (all[i]-tmp+MOD)%MOD;dp[0][i] = save[i];}for(int i=1;i<kk;i++){for(int j=1;j<(1<<n);j++){int tj= j-lowbit(j);for(int k=tj; k>0;k = (k-1)&tj ){dp[i][j] += dp[i-1][k]*save[j-k];dp[i][j] %= MOD;}}}printf("Case #%d:\n",tt++);cout<<dp[kk-1][(1<<n)-1]*s2[cnt0]%MOD<<endl;}return 0;
}

CODE

hdu 5713(状态压缩DP)相关推荐

  1. hdu 5067(状态压缩dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 解题思路:这道题开始想复杂了,想用bfs去求出最短距离,其实没必要,因为题目中没有阻碍关系,所以 ...

  2. hdu 5418(状态压缩dp+Floyd)

    点击打开链接 解题思路:这道题目和TSP问题很相似,唯一不同的是同一个点可以重复走几次.... 这道题目只有16个顶点,所以很容易想到状态压缩dp,dp[i][j]表示到达顶点i时的状态为j的最小花费 ...

  3. Victor and World(spfa+状态压缩dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...

  4. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  5. 状态压缩dp学习小记part2

    继续学习状态压缩的相关知识. 本来准备继续按照上篇博文里提到的那篇论文继续学习,但被矩形完全覆盖虐了回来,决定先做些其他的题增进理解之后再回来做. Zoj 3471 Most Powerful 题目链 ...

  6. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

  7. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  8. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  9. hdu1074 状态压缩dp+记录方案

    题意:       给你一些作业,每个作业有自己的结束时间和花费时间,如果超过结束时间完成,一天扣一分,问你把n个作业完成最少的扣分,要求输出方案. 思路:       状态压缩dp,记录方案数的地方 ...

最新文章

  1. 软件测试 -- 元素定位
  2. Codeforces 484B Maximum Value(高效+二分)
  3. eclipse中YAML文件编辑插件:Yaml Editor插件安装
  4. LiveVideoStackCon 2021北京站 9月再次启航!
  5. Java中线程池,你真的会用吗?
  6. Python3之socket编程(TCP/UDP,粘包问题,数据传输、文件上传)
  7. PHP-----文件系统的交互
  8. pythonATM,购物车项目实战_补充5-interface接口
  9. Setinterl全面介绍
  10. 一个500强公司的数据化运营管理实践 1
  11. 一元二次方程共轭复根c语言,共轭复根怎么求(共轭虚根α和β怎么求)
  12. 直播平台搭建源码,css预加载旋转动画 与 流光字体
  13. 一台“真正的”网吧电影服务器只要6000元
  14. WebView加载String字符串
  15. (CVPR-2022)AdaViT:用于高效图像识别的自适应视觉变换器
  16. 一、区块链项目的基础架构
  17. visual studio 2010教程-创建网站项目
  18. 美国纽约大学计算机排名,纽约大学计算机科学与信息系统世界排名2019年最新排名第20(QS世界排名)...
  19. 初一年级上学期计算机课知识总结,在电脑上学习七年级上册课程
  20. linux下烧写atmel芯片

热门文章

  1. django 快速实现登录
  2. Listview获取选中行的值
  3. iOS 让UIView的左上角和右上角为圆角
  4. Qt浅谈之一:内存泄露(总结)
  5. java(十)IO流
  6. iOS动画详解(学习动画看这一篇就够了)
  7. [Leetcode] Wiggle Sort 摇摆排序
  8. 汇编语言第二课作业-实验1
  9. 2542513 - AS Java fails to start - Initialization of destination UMEBackendConnection failed
  10. 区块链隐私:交易还是计算?