K个联通块
题意:
有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有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个联通块的更多相关文章
- 树上第k大联通块
题意:求树上第k大联通块 n,k<=1e5 考虑转化为k短路的形式. 也就是要建出一张图是的这条图上每一条S到T的路径都能代表一个联通块. 点分治建图 递归下去,假定每个子树的所有联通块中都可以 ...
- [HDU5713]K个联通块
[HDU5713]K个联通块 题目大意: 有一张\(n(n\le14)\)个点,\(m\)条边无重边的无向图,求有多少个边集,使得删掉边集里的边后,图里恰好有\(k\)个连通块. 思路: 一个显然的动 ...
- 【HDOJ5713】K个联通块(状压DP,计数)
题意:有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有K个连通块. 1≤T≤201≤K≤N≤140≤M≤N∗(N+1)/21≤a,b≤N 思路:From http://blog ...
- 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; ...
- Codeforces 731C. Socks 联通块
C. Socks time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input o ...
- 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 ...
- Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)
题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...
- [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- 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 ...
随机推荐
- Thrift安装介绍
一.简介 1.语言库要求 因为thrift支持多语言.所以编译thrift源代码的过程中,会用到该语言的一些类库.如c++的boost.java的jdk等. 那么,在安装thrift过程中,须要对各种 ...
- Android开源git40个App源代码
(JamsMusicPlayer)非常棒的音乐播放器(new) (F8)日程安排的软件 (Conversations)基于XMPP的应用 (Bitocle)能够在手机上查看自己github ...
- kubernetes调度之资源耗尽处理配置
系列目录 本篇将介绍如何使用kubelet处理资源耗尽的情况 当可用的计算机资源非常低的时候,kubelet仍然要保证节点的稳定性.当处理不可压缩的计算机资源(比如内存或磁盘空间)时,这尤其重要,当这 ...
- java Comparator比较器排序法
注意:排序的字段不为空,否则抛出空指针异常! 第一步:先编写一个比较器类 如下: 第二步:此集合的对象 EO 必须重写 此equals 方法 如图: 第三步:调用使用此比较器 如图:
- git和github菜鸟使用步骤
刚刚在windows7下安装完git.奉上安装步骤. git安装 安装git程序.运行以下操作: 1. $ cd ~/.ssh //检查计算机ssh密钥 2.假设没有提示:No such fil ...
- AAC包增加ADTS头Without MediaCodec
AAC原始码流无法直接播放,一般需要封装为ADTS格式才能再次使用,本博主在android中用MediaCodec编码得到的AAC就是raw格式,为了保存为.aac格式,需要增加adts头,这样就可以 ...
- js怎么select 选中的值
var obj = document.getElementById(”SelectID”); var index = obj.selectedIndex; // 选中索引var text = obj. ...
- static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
总结: 1.无论一个类实例化多少对象,它的静态变量只有一份拷贝: 静态域属于类,而非由类构造的实例化的对象,所有类的实例对象共享静态域. class Employee { private static ...
- Redis 分布式锁的正确实现方式(转)
_ 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各 ...
- centOS7安装docker步骤
首先准备一台linux系统, Docker需要一个64位系统的系统,内核的版本必须大于3.10,可以用命令来检查是否满足要求: 满足条件后,下面开始正式安装步骤: 1.更新yum: sudo yum ...