【BZOJ4596】黑暗前的幻想乡(矩阵树定理,容斥)

题面

BZOJ

有\(n\)个点,要求连出一棵生成树,

指定了一些边可以染成某种颜色,一共\(n-1\)种颜色,

求所有颜色都出现过的生成树方案数。

题解

一脸的容斥啊。

先矩阵树定理暴力算出所有符合条件的生成树,然后减去\(n-2\)中颜色的方案数,

再加上\(n-3\)种颜色的方案数......

所以直接暴力枚举颜色的子集,每次矩阵树就好了。

时间复杂度大概是\(O(2^{n-1}n^3log)\)???

虽然\(log\)小的不行,甚至可以当做没有啊。

但是,。。这复杂度假的不行啊。、

假装复杂度非常正确

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define RG register
#define MAX 20
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,a[MAX][MAX],m[MAX],cnt[1<<17],ans;
int u[MAX][MAX*MAX],v[MAX][MAX*MAX];
int Calc(int S)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)a[i][j]=0;
for(int i=1;i<n;++i)
if(S&(1<<(i-1)))
for(int j=1;j<=m[i];++j)
{
int x=u[i][j],y=v[i][j];
++a[x][x];++a[y][y];--a[x][y];--a[y][x];
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)add(a[i][j],MOD);
int ret=1;
for(int i=2;i<=n;++i)
{
for(int j=i+1;j<=n;++j)
while(a[j][i])
{
int t=a[i][i]/a[j][i];
for(int k=i;k<=n;++k)
a[i][k]=(a[i][k]-1ll*a[j][k]*t%MOD+MOD)%MOD,swap(a[i][k],a[j][k]);
ret=MOD-ret;
}
ret=1ll*ret*a[i][i]%MOD;
}
return ret;
}
int main()
{
n=read();
for(int i=1;i<n;++i)
{
m[i]=read();
for(int j=1;j<=m[i];++j)u[i][j]=read(),v[i][j]=read();
}
for(int i=0;i<1<<(n-1);++i)cnt[i]=cnt[i>>1]+(i&1);
for(int i=0;i<1<<(n-1);++i)add(ans,((n-1-cnt[i])&1)?MOD-Calc(i):Calc(i));
printf("%d\n",ans);
}

【BZOJ4596】黑暗前的幻想乡(矩阵树定理,容斥)的更多相关文章

  1. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 325[Submit][Sta ...

  2. [SHOI2016] 黑暗前的幻想乡 - 矩阵树定理,容斥

    #include <bits/stdc++.h> using namespace std; #define int long long const int N = 20; const in ...

  3. bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)

    bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...

  4. 【BZOJ4596】【Luogu P4336】 [SHOI2016]黑暗前的幻想乡 矩阵树定理,容斥

    同样是矩阵树定理的裸题.但是要解决它需要能够想到容斥才可以. \(20\)以内的数据范围一定要试试容斥的想法. #include <bits/stdc++.h> using namespa ...

  5. Luogu P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理+容斥原理

    真是菜到爆炸....容斥写反(反正第一次写qwq) 题意:$n-1$个公司,每个公司可以连一些边,求每个边让不同公司连的生成树方案数. 矩阵树定理+容斥原理(注意到$n$不是很大) 枚举公司参与与否的 ...

  6. 【bzoj4596】[Shoi2016]黑暗前的幻想乡 (矩阵树定理+容斥)

    Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日高谈所有妖怪平等 ...

  7. P4336 [SHOI2016]黑暗前的幻想乡

    P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理(高斯消元+乘法逆元)+容斥 ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ ...

  8. 洛谷 P4336 黑暗前的幻想乡 —— 容斥+矩阵树定理

    题目:https://www.luogu.org/problemnew/show/P4336 当作考试题了,然而没想出来,呵呵. 其实不是二分图完美匹配方案数,而是矩阵树定理+容斥... 就是先放上所 ...

  9. 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理

    [BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...

随机推荐

  1. eclipse jetty debug

    一.    1, Eeclipse中选择 Run --> External Tools --> External Tools Configurations 然后new一个Program项. ...

  2. github如何删除仓库中文件夹

    github项目中,经常大家更新.添加都非常熟悉,但是如果想要删掉一个文件夹,很多人就不知道怎么操作了. 网上查了一些方法,大部分都是删除仓库重新上传,这样肯定是不行的,首先不说任务量大,而且删除仓库 ...

  3. 「日常训练」Jongmah(Codeforces-1110D)

    题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...

  4. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  5. NO--09今天遇到的一点小问题之axios全局注册

    今天用 Vue 写项目的时候,用到 axios ,因为 axios 不能用 Vue.use() ,所以在每个 .vue 文件中使用 axios 时就需要 import , .vue 文件少的话还好说, ...

  6. 爬虫2.4-scrapy框架-图片分类下载

    目录 scrapy框架-图片下载 1 传统下载方法: 2 scrapy框架的下载方法 3 分类下载完整代码 scrapy框架-图片下载 python小知识: map函数:将一个可迭代对象的每个值,依次 ...

  7. [python]序列的重复操作符

    当你需要需要一个序列的多份拷贝时,重复操作符非常有用,它的语法如下: sequence * copies_int In [1]: a = [1,2,3,4] In [2]: a * 5 Out[2]: ...

  8. 算法笔记(c++)--01背包问题

    算法笔记(c++)--经典01背包问题 算法解释起来太抽象了.也不是很好理解,最好的办法就是一步步写出来. 背包问题的核心在于m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+ ...

  9. loadrunner--基础2

    LR11-03 一.并发测试(n VU) 1.并发测试两个条件 1)脚本中要有 集合点(并发点) 2)控制台中要设置并发策略(选择第一项,所有虚拟用户到达集合点后释放) 集合点: 5个线程,代表5个V ...

  10. Python Requests库入门——应用实例-百度、360搜索关键词提交

    百度的关键词接口: http://www.baidu.com/s?wd=keyword 360的关键词接口: http://www.so.com/s?q=keyword keyword就是需要查找的关 ...