题意:

有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有K个联通块。

解法:

考虑dp,$h(i,S)$表示有$i$个联通块,点集为$S$的图的个数,$g(S)$表示点集为S的连通图的个数。

所以有$h(i,S) = \sum_{S_0 \subseteq S}{h(i-1,S_0) \cdot f(S-S0)}$

$answer = \frac{h(K,ALL)}{K!}$

接下来只要求出 $g(S)$ 即可,考虑 $dp$

首先枚举一个点 $x$ ,求出所有包含 $x$ 的 $g(S)$,然后递归求去掉 $x$ 的 $g(S)$ ,直到 $S$ 为空

求包含 $x$ 的$g(S)$ 时,可以考虑用容斥来求。

$M(S)$ 表示 $S$ 集合内有多少条边。

$f(S) = 2^{M(S)} - \sum_{S_0 \subseteq S}{f(S0) \cdot 2^{M(S-S0)} }$

时间复杂度$O(K \cdot 3^n)$

 #include <iostream>
#include <cstdio>
#include <cstring> #define N 15
#define LL long long
#define bit(x) (1<<(x))
#define P 1000000009LL using namespace std; int n,m,K;
int cnt[<<N];
LL f[<<N],all[<<N],ansv[<<N];
LL h[N][<<N];
int g[N]; int cnt_bit(int S)
{
int ans=;
for(;S;S>>=) if(S&) ans++;
return ans;
} LL qpow(LL x,int n)
{
LL ans=;
for(;n;n>>=,x=x*x%P)
if(n&) ans=ans*x%P;
return ans;
} LL calc(int S)
{
int tmp=;
for(int i=;i<n;i++)
if(S&bit(i)) tmp += cnt[S&g[i]];
return qpow(,tmp);
} int main()
{
int Te=;
int T;
cin>>T;
for(int S=;S<(<<N);S++) cnt[S]=cnt_bit(S);
while(~scanf("%d%d%d",&n,&m,&K))
{
for(int i=;i<n;i++) g[i]=;
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
x--;
y--;
g[x]|=bit(y);
}
for(int S=;S<(<<n);S++) all[S]=calc(S);
for(int i=;i<n;i++)
{
ansv[]=;
for(int S=;S<(<<n);S++)
if(S&bit(i))
{
f[S]=all[S];
for(int S0=S;S0;S0=(S0-)&S)
if((S0&bit(i)) && S0<S)
{
f[S] += P - f[S0]*all[S^S0]%P;
if(f[S]>=P) f[S]-=P;
}
ansv[S]=f[S];
}
}
for(int S=;S<(<<n);S++) h[][S]=;
h[][]=;
for(int i=;i<=K;i++)
{
for(int S=;S<(<<n);S++)
{
h[i][S]=;
for(int S0=S;S0;S0=(S0-)&S)
{
h[i][S] += h[i-][S^S0]*ansv[S0]%P;
if(h[i][S]>=P) h[i][S]-=P;
}
}
}
LL fac_K=;
for(int i=;i<=K;i++) fac_K=fac_K*i%P;
printf("Case #%d:\n",++Te);
cout << h[K][(<<n)-]*qpow(fac_K,P-)%P << endl;
}
return ;
}

K个联通块的更多相关文章

  1. 树上第k大联通块

    题意:求树上第k大联通块 n,k<=1e5 考虑转化为k短路的形式. 也就是要建出一张图是的这条图上每一条S到T的路径都能代表一个联通块. 点分治建图 递归下去,假定每个子树的所有联通块中都可以 ...

  2. [HDU5713]K个联通块

    [HDU5713]K个联通块 题目大意: 有一张\(n(n\le14)\)个点,\(m\)条边无重边的无向图,求有多少个边集,使得删掉边集里的边后,图里恰好有\(k\)个连通块. 思路: 一个显然的动 ...

  3. 【HDOJ5713】K个联通块(状压DP,计数)

    题意:有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有K个连通块. 1≤T≤201≤K≤N≤140≤M≤N∗(N+1)/21≤a,b≤N 思路:From http://blog ...

  4. hdu5713 K个联通块[2016百度之星复赛B题]

    dp 代码 #include<cstdio> ; ; int n,m,k,cnt[N]; ]; ][],i,j,l,a,b; int check(int x,int y) { int i; ...

  5. Codeforces 731C. Socks 联通块

    C. Socks time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input o ...

  6. Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量

    D. Directed Roads   ZS the Coder and Chris the Baboon has explored Udayland for quite some time. The ...

  7. Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)

    题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...

  8. [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  9. PAT A1013 Battle Over Cities (25 分)——图遍历,联通块个数

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

随机推荐

  1. mysql drop table命令使用总结

    drop性能 drop table(innodb引擎) 数量2000w,只需要5m

  2. soapUI学习笔记--用例字段参数化

    字段参数化的简单操作 1.把Request新增一个TestCase 增加TestCase,下方会出现: 2.案例中,请求参数只有一个.先运行下请求,可以运行成功(保证接口是通的) 3.添加参数.见图中 ...

  3. hdparm - get/set SATA/IDE device parameters

    hdparm(8) - Linux man page Name hdparm - get/set SATA/IDE device parameters Synopsis hdparm [ flags ...

  4. hdu5318 The Goddess Of The Moon (矩阵高速幂优化dp)

    题目:pid=5318">http://acm.hdu.edu.cn/showproblem.php?pid=5318 题意:给定n个数字串和整数m,规定若数字串s1的后缀和数字串s2 ...

  5. Python自动生成文章

    为了应付某些情况,需要做17份记录.虽然不很重要,但是17份完全雷同也不很好.大体看了一下,此记录大致分为四段.于是决定每段提供四种选项,每段四选一,拼凑成四段文字,存成一个文件.文件名就叫“XX记录 ...

  6. Java中的class类的cast方法和asSubclass方法

    一般来说cast是转型的意思,但是学java的时间也不短了,class类居然还有cast这个方法,这里来学习一下这个cast有何用. 第一次看到这个cast是在Spring的源码中, spring-f ...

  7. 数据挖掘项目之---通过对web日志的挖掘来实现内容推荐系统

    先说一说问题,不知道大家有没有这样的经验,反正我是经常碰到. 举例1,某些网站每隔几天就发邮件给我,每次发的邮件内容都是一些我根本不感兴趣的东西,我不甚其扰,对其深恶痛绝.         举例2,添 ...

  8. springboot实战--笔记

    由于这本书看过一遍,所以这里是二次复习,记录的东西比较少,就不分章节了. 共12章,524页,预计时间是18h 第一章 spring基础: 第二章 spring常用配置: bean的Scope:sin ...

  9. Message-oriented middleware

    en.wikipedia.org/wiki/Message-oriented_middleware Message-oriented middleware (MOM) is software or h ...

  10.  (转)windows一台电脑添加多个git账号

    版权声明:技术总结来自互联网,书籍,以及工作积累.如果觉得我的总结有帮助,欢迎分享. https://blog.csdn.net/qq1332479771/article/details/701496 ...