要进行两次dp,

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

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

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

转移方程:

        save[] = ;//这里用save[i]表示dp[i]
for(int i=;i<(<<n);i++)
{
int ti = i-lowbit(i); //一定选择最后一个点,使之有序
int j = ti;
long long tmp=;//问题转化为对立问题,记录有多少不连通边集的情况,all[i]表示i中的点,边集的所有可能情况。
for(;j>;j=(j-)&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=;i<kk;i++)
{
for(int j=;j<(<<n);j++)
{
int tj= j-lowbit(j);
for(int k=tj; k>;k = (k-)&tj )
{
dp[i][j] += dp[i-][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 1000000009 long long dp[][<<];
int mat[][];
long long save[<<];
long long s2[];
long long all[<<]; int lowbit(int x)
{
return x&(-x);
} void test()
{
int cnt=;
for(int i=;i<(<<);i++)
{
for(int j=i;j>;j=(j-)&i)
{
cnt++;
}
}
cout<<cnt<<endl;
cout<<(<<)<<endl;
} int main() { s2[] = ;
for(int i=;i <= *;i++)
s2[i] = (*s2[i-])%MOD; //test();
int T;
cin>>T; int tt=;
while(T--)
{
int kk,n,m;
scanf("%d%d%d",&n,&m,&kk);
int cnt0=;
memset(mat,,sizeof(mat));
for(int i=;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
a--; b--;
if(a==b) cnt0++;
else
{
mat[a][b] = mat[b][a] = ;
}
} memset(save,,sizeof(save));
memset(all,,sizeof(all));
memset(dp,,sizeof(dp)); for(int i=;i<(<<n);i++)
{
int tcnt=;
for(int j=;j<n;j++)
{
if( ((<<j)&i) !=)
{
for(int k=j+;k<n;k++)
{
if( ((<<k)&i) != )
{
tcnt += mat[j][k];
}
}
}
}
all[i] = s2[tcnt];
} save[] = ;
for(int i=;i<(<<n);i++)
{
int ti = i-lowbit(i);
int j = ti;
long long tmp=;
for(;j>;j=(j-)&ti)
{
tmp += save[i-j]*all[j];
tmp %= MOD;
}
save[i] = (all[i]-tmp+MOD)%MOD;
dp[][i] = save[i];
} for(int i=;i<kk;i++)
{
for(int j=;j<(<<n);j++)
{ int tj= j-lowbit(j);
for(int k=tj; k>;k = (k-)&tj )
{
dp[i][j] += dp[i-][k]*save[j-k];
dp[i][j] %= MOD;
}
}
}
printf("Case #%d:\n",tt++); cout<<dp[kk-][(<<n)-]*s2[cnt0]%MOD<<endl; } return ;
}

CODE

hdu 5713(状态压缩DP)的更多相关文章

  1. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  2. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  3. hdu 4284 状态压缩dp

    题意: 有N 个点的无向图,要去其中 h个地点做事,做事需要先办理护照,之后可以挣一定数量的钱,知道了一开始有的总钱数,和 一些城市之间           道路的花费,问可不可以在 指定的 h 个城 ...

  4. hdu 2167 状态压缩dp

    /* 状态转移方程:dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]); */ #include<stdio.h> #include<string ...

  5. HDU 4856 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...

  6. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  7. 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

    Sitting in Line Problem Description   度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...

  8. HDU 5067 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出 ...

  9. hdu 4539(状态压缩dp)

    题意:曼哈顿距离是指:|x1-x2|+|y1-y2|,只要知道这个概念题意就懂了. 分析:这道题与前面做的几道题有所不同,因为当前行不仅与前一行有关,而且与前两行有关,所以我们开数组的时候还要记录前两 ...

随机推荐

  1. YTU 2987: 调整表中元素顺序(线性表)

    2987: 调整表中元素顺序(线性表) 时间限制: 1 Sec  内存限制: 2 MB 提交: 1  解决: 1 题目描述 若一个线性表L采用顺序存储结构存储,其中所有元素都为整数.设计一个算法,将所 ...

  2. SlickGrid example 3: 可编辑单元

    <button onclick="grid.setOptions({autoEdit:true})"> 设置自动辅助编辑下一个元素.   代码: <!DOCTYP ...

  3. Poj(2253),Dijkstra松弛条件的变形

    题目链接:http://poj.org/problem?id=2253 题意: 给出两只青蛙的坐标A.B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的.显然从A到B存在至少一条的通路,每一条通 ...

  4. hdu 2837 坑题。

    Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. 2016年12月15日 星期四 --出埃及记 Exodus 21:10

    2016年12月15日 星期四 --出埃及记 Exodus 21:10 If he marries another woman, he must not deprive the first one o ...

  6. php操作redis常用方法源代码

    1,connect 描述:实例连接到一个Redis.参数:host: string,port: int返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: <?php $redis ...

  7. 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)

    [项目管理和构建]十分钟教程,eclipse配置maven + 创建maven项目(三) 上篇博文中我们介绍了maven下载.安装和配置(二),这篇博文我们配置一下eclipse,将它和maven结合 ...

  8. Python3基础 assert关键字 成功啥事没有,失败了就报错

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  9. Java String 一些实验

    1.请查看String.equals()方法的实现代码,注意学习其实现方法. 结果: 原因: 当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但s1.s2仍然是两个独立的对象 ...

  10. SUSE Linux Enterprise Server 设置IP地址、网关、DNS

    说明: ip:192.168.21.172 子网掩码:255.255.255.0 网关:192.168.21.2 dns:8.8.8.8 8.8.4.4 1.设置ip地址 vi /etc/syscon ...