https://www.lydsy.com/JudgeOnline/problem.php?id=4596

https://www.luogu.org/problemnew/show/P4336#sub

四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序。但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日高谈所有妖怪平等,幻想乡多元化等等,对于幻想乡目前面临的种种大问题却给不出合适的解决方案。
风间幽香是幻想乡里少有的意识到了问题的严重性的大妖怪。她这次勇敢的站了出来参加幻想乡大选。提出包括在幻想乡边境建墙(并让人类出钱),大力开展基础设施建设挽回失业率等一系列方案,成为了大选年出人意料的黑马并顺利的当上了幻想乡的大统领。
幽香上台以后,第一项措施就是要修建幻想乡的公路。幻想乡有 N 个城市,之间原来没有任何路。幽香向选民承诺要减税,所以她打算只修 N- 1 条路将这些城市连接起来。但是幻想乡有正好 N- 1 个建筑公司,每个建筑公司都想在修路的过程中获得一些好处。虽然这些建筑公司在选举前没有给幽香钱,幽香还是打算和他们搞好关系,因为她还指望他们帮她建墙。所以她打算让每个建筑公司都负责一条路来修。
每个建筑公司都告诉了幽香自己有能力负责修建的路是哪些城市之间的。所以幽香打算选择 N-1 条能够连接幻想乡所有城市的边,然后每条边都交给一个能够负责该边的建筑公司修建,并且每个建筑公司都恰好修一条边。
幽香现在想要知道一共有多少种可能的方案呢?两个方案不同当且仅当它们要么修的边的集合不同,要么边的分配方式不同。

看了矩阵树教程它让我做这道题http://www.cnblogs.com/zj75211/p/8039443.html。

深感自己老龄化严重。

n<=17显然是要压状态了,那我们只能压是否选择每个公司来建边了……好像和题意不符啊。

但是思考,事实上我们要求的东西可以通过容斥来表达出来,即(不考虑哪些公司建哪些边)我加所有公司的边的方案数-我少一个公司的所有边的方案数+……最后反正是把所有不合法的方案都剔除出去了。

那么我们枚举状态,用矩阵树定理求出生成树个数就是方案了,之后再加加减减就行了。

#include<cstdio>
#include<queue>
#include<cstring>
#include<cmath>
#include<cctype>
#include<algorithm>
using namespace std;
typedef long long ll;
const int p=1e9+7;
const int N=18;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
ll x[N][N],ans;
ll gauss(int n){ll res=1;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){while(x[j][i]!=0){ll t=x[i][i]/x[j][i];for(int k=i;k<=n;k++)x[i][k]=(x[i][k]-x[j][k]*t)%p;for(int k=i;k<=n;k++)swap(x[i][k],x[j][k]);res=-res;}}if(!x[i][i])return 0;res=(res*x[i][i])%p;}return (res%p+p)%p;
}
int n,m[N],u[N][N*N],v[N][N*N],d[N];
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=(1<<(n-1))-1;i>=0;i--){int tot=0;memset(x,0,sizeof(x));memset(d,0,sizeof(d));for(int j=1;j<n;j++){int w=(i>>(j-1))&1;if(w){for(int k=1;k<=m[j];k++){x[u[j][k]][v[j][k]]--;x[v[j][k]][u[j][k]]--;d[u[j][k]]++;d[v[j][k]]++;}for(int k=1;k<=n;k++)x[k][k]=d[k];tot++;}}ll tmp=gauss(n-1);if((n-1-tot)%2==0)ans=(ans+tmp)%p;else ans=(ans-tmp)%p;}printf("%lld\n",(ans%p+p)%p);return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8980839.html

BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解相关推荐

  1. [BZOJ4596][Shoi2016]黑暗前的幻想乡-Matrix Tree 矩阵树定理

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

  2. 洛谷 P4336 [SHOI2016] 黑暗前的幻想乡 题解

    前置芝士 Kirchhoff 矩阵树定理 Kirchhoff矩阵树定理解决了一个问题:对于一个确定的无向图,其究竟有多少个生成树? 对于一个无向图,我们拥有其邻接矩阵 A\bf{A}A. 这里的邻接矩 ...

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

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

  4. Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理) Problem n≤1 ...

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

    题目 P4336 [SHOI2016]黑暗前的幻想乡 做法 每种颜色恰好一条边,有点难处理啊 根据套路,数据范围这么小,容斥一下所有的情况就可以了 对每种颜色进行状压,表这次只能选这些颜色,做\(n- ...

  6. SHOI2016 黑暗前的幻想乡

    题目链接:戳我 幻想乡是个什么东西??(逃 矩阵树定理+容斥 就是设\(dp[i]\)表示至多i个公司修建道路,那么我们有\(ans=dp[n-1]-dp[n-2]+dp[n-3]......\)ba ...

  7. ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4596 题解: 容斥,矩阵树定理,矩阵行列式 先说说容斥:(一共有 N-1个公司) 令 f[i ...

  8. bzoj 4596: [Shoi2016]黑暗前的幻想乡

    这个题貌似奶了一口trump,,, 本来看到一个公司一条边,而且N是那么科学,肯定要容斥了,然后蛋疼的想应该怎么求生成树.. 本来一开始乱说了个矩阵树定理,然而忘了,就像奇奇怪怪的东西了..然并卵,正 ...

  9. [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)

    传送门 Description 给出 n 个点和 n−1 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 109+7 取模. Input 第一行包含一个正整数 N(N& ...

最新文章

  1. python获取进程编号(目的、获取当前进程编号、根据编号杀死指定进程号、获取当前父进程编号)
  2. linux c语言定位显示字符,Linux c语言实现修改文本字符串
  3. 代理类Proxy------ WeakHashMap----ReferenceQueue---- Reference
  4. 这本 “写不完” 的黑科技笔记本,恐怕要颠覆整个行业!
  5. SqlServer优化:当数据量查询不是特别多,但数据库服务器的CPU资源一直100%时,如何优化?...
  6. usb大容量存储设备驱动程序_20年历史了!为什么USB接口还存在?网友:原来如此...
  7. 如何删除github远程仓库?三部搞定!
  8. 联想计算机BIOS启动顺序boot,如何进入BIOS并更改启动顺序?
  9. 25GbE可以解决数据中心过载问题吗?
  10. 在 Windows 上进行 Laravel Homestead 安装、配置及测试
  11. LSTM背后的数学原理
  12. 冗余代码检查工具Simian
  13. 张一鸣:技术与人文、责任与价值观之间到底是什么关系?
  14. 软件测试工程师薪酬水平,软件测试工程师工资怎么样?高吗?
  15. python爬取问卷星内容_Python Selenium 问卷星自动填写
  16. 巧用 Linux 定时任务
  17. python 多态app_**python多态
  18. 委托,了解发布者订阅者模型
  19. WPF使用SaveFileDialog对话框保存文件时不要用DialogResult.OK判断对话框正常关闭
  20. Java项目:SSM医院分诊管理系统

热门文章

  1. emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全
  2. figma设计_Figma中简单,可重复使用的设计系统
  3. 面试官:能不能手写一个 Promise?
  4. sass和compass基础用法
  5. 海量数据索引与近似最近邻随记
  6. 简单分析Guava中RateLimiter中的令牌桶算法的实现
  7. 构建LAMP平台及应用系统
  8. 敏捷需要重构吗?不需要吗?
  9. java操作redis简单学习3
  10. mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增...