题意:

有一张无重边的无向图, 求有多少个边集,使得删掉边集里的边后,图里恰好有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. JavaScript插件编写指南

    在编写插件之前,大家要先了解做插件的几个要点: 插件需要满足的条件 一个可复用的插件需要满足以下条件: 插件自身的作用域与用户当前的作用域相互独立,也就是插件内部的私有变量不能影响使用者的环境变量: ...

  2. ES7前端异步玩法:async/await理解 js原生API妙用(一)

    ES7前端异步玩法:async/await理解   在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是“异步”的意思,a ...

  3. 基于UDP的一对回射客户/服务器程序

    前言 之前曾经学习过一对回射客户/服务器程序的例子,不过那个是基于TCP协议的.本文将讲解另一对回射客户/服务器程序,该程序基于UDP协议.由于使用的协议不同,因此编写出的程序也有本质上的区别,应将它 ...

  4. LeetCode(70)题解: climbing-stairs

    https://leetcode.com/problems/climbing-stairs/ 题目: You are climbing a stair case. It takes n steps t ...

  5. EasyRTMP直播推送效率优化之开源librtmp CPU占用高效率优化

    本文转自EasyDarwin开源团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52950948 EasyRTMP 前面介绍过Eas ...

  6. Hibernate的检索策略和优化

    一.检索策略概述 当我们实现了一对多或者多对多的映射后,在检索数据库时需要注意两个问题: 1.使用尽可能小的内存:当 Hibernate 从数据库中加载一个客户信息时, 如果同时加载所有关联这个客户的 ...

  7. js 怎么传递参数

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  8. Android笔记之manifestPlaceholders

    有时根据项目需要,AndroidManifest.xml中的meta-data的值分测试和正式 为了能自动地更换meta-data值,就需要用到manifestPlaceholders 语法:mani ...

  9. 2 Maven使用入门

    一.编写pom.xml文件     Maven项目的核心是pom.xml.POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等. ...

  10. SpringBoot-(3)-RestController接口参数

    一,无参接口: //无参接口 @RequestMapping("/appSecret") public String secret() { return "EK125EK ...