P4336-[SHOI2016]黑暗前的幻想乡【矩阵树定理,容斥】
正题
题目链接:https://www.luogu.com.cn/problem/P4336
题目大意
nnn个点,n−1n-1n−1个边集,求有多少种方案使得每个边集中恰好选出一条边使得这nnn个点连成一棵树。
解题思路
我们需要利用好n−1n-1n−1个边集这个性质,因为nnn很小,考虑容斥。
和[ZJOI2016]小星星那题一样,如果对于kkk个边集我们不选,那么就表示有kkk条边是重复的,所以容斥系数就是(−1)k(-1)^k(−1)k。
枚举去掉的边集,然后剩下的用矩阵树求答案即可。
时间复杂度O(2nn3)O(2^nn^3)O(2nn3),实际会小一些
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mp(x,y) make_pair(x,y)
#define ll long long
using namespace std;
const ll N=20,P=1e9+7;
ll n,a[N][N],ans;
vector<pair<ll,ll> >q[N];
ll count(ll x){ll ans=0; while(x){ans++;x-=(x&-x);}return ans;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void solve(ll p){memset(a,0,sizeof(a));for(ll i=1;i<n;i++){if((p>>i-1)&1)continue;for(ll j=0;j<q[i].size();j++){ll x=q[i][j].first,y=q[i][j].second;a[x][y]--;a[y][x]--;a[x][x]++;a[y][y]++;}}ll f=(count(p)&1)?-1:1,prod=1;for(ll i=1;i<n;i++){ll w=i;for(ll j=i;j<n;j++){if(a[i][j]){if(i!=j)f=-f;w=j;break;}}swap(a[i],a[w]);prod=prod*a[i][i]%P;if(!a[i][i])return;ll inv=power(a[i][i],P-2);for(ll j=i;j<n;j++)a[i][j]=a[i][j]*inv%P;for(ll j=i+1;j<n;j++){ll rate=P-a[j][i];for(ll k=i;k<n;k++)a[j][k]=(a[j][k]+rate*a[i][k]%P+P)%P;}}ans=(ans+prod*f+P)%P;return;
}
signed main()
{scanf("%lld",&n);for(ll i=1;i<n;i++){ll m,x,y;scanf("%lld",&m);for(ll j=1;j<=m;j++){scanf("%lld%lld",&x,&y);q[i].push_back(mp(x,y));}}ll MS=(1<<n-1);for(ll i=0;i<MS-1;i++)solve(i);printf("%lld\n",ans);return 0;
}
P4336-[SHOI2016]黑暗前的幻想乡【矩阵树定理,容斥】相关推荐
- Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理) Problem n≤1 ...
- P4336 [SHOI2016]黑暗前的幻想乡
题目 P4336 [SHOI2016]黑暗前的幻想乡 做法 每种颜色恰好一条边,有点难处理啊 根据套路,数据范围这么小,容斥一下所有的情况就可以了 对每种颜色进行状压,表这次只能选这些颜色,做\(n- ...
- 洛谷 P4336 [SHOI2016] 黑暗前的幻想乡 题解
前置芝士 Kirchhoff 矩阵树定理 Kirchhoff矩阵树定理解决了一个问题:对于一个确定的无向图,其究竟有多少个生成树? 对于一个无向图,我们拥有其邻接矩阵 A\bf{A}A. 这里的邻接矩 ...
- 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理
[BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...
- SHOI2016 黑暗前的幻想乡
题目链接:戳我 幻想乡是个什么东西??(逃 矩阵树定理+容斥 就是设\(dp[i]\)表示至多i个公司修建道路,那么我们有\(ans=dp[n-1]-dp[n-2]+dp[n-3]......\)ba ...
- [BZOJ4596][Shoi2016]黑暗前的幻想乡-Matrix Tree 矩阵树定理
黑暗前的幻想乡 Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日 ...
- BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4596 https://www.luogu.org/problemnew/show/P4336#su ...
- ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4596 题解: 容斥,矩阵树定理,矩阵行列式 先说说容斥:(一共有 N-1个公司) 令 f[i ...
- bzoj 4596: [Shoi2016]黑暗前的幻想乡
这个题貌似奶了一口trump,,, 本来看到一个公司一条边,而且N是那么科学,肯定要容斥了,然后蛋疼的想应该怎么求生成树.. 本来一开始乱说了个矩阵树定理,然而忘了,就像奇奇怪怪的东西了..然并卵,正 ...
- [矩阵树定理 容斥 meet in middle] Topcoder SRM 551 DIV1 Hard. SweetFruits
枚举最后的树中有多少个是truly sweet的 答案就是 ∑i=0nfi×gi \sum_{i=0}^n f_i\times g_i 其中,fif_i 表示选出 ii 个水果使其价值和不超过Limi ...
最新文章
- js获取url地址栏参数的方法,解决中文乱码问题,能支持中文参数
- opencv python 将RGB表示的图像转换为HSV(或Ycbcr)表示
- 贺利坚老师汇编课程57笔记:CMP和JXXX配合实现条件转移指令if
- Transaction事务
- 函数名称修饰符__cdelcl __fastcall 与__stdcall
- 小程序开发组件的使用
- 假如正则从来没来过,我们该如何去匹配一个字符串?
- Kubernetes证书相关(CFSSL)
- linux php虚拟主机,linux上php虚拟主机(linux搭建虚拟主机)
- 入门版Linux上恢复误删除的文件
- 否则 JavaFX 应用程序类必须扩展javafx.application.Application
- Android短信Messaging数据库字段分析
- 无法创建链接服务器 ORCL 的 OLE DB 访问接口 OraOLEDB.Oracle 的实例 (错误:7302)...
- Tslint检查下代码JavaScript(angular)规范
- 性能第二讲:性能优化-每个程序员都应该知道的数字
- Goldsrc 地图 BSP 文件格式规范
- name '_name_' is not defined
- stricmp linux 头文件,头文件stdio.hstdlib.hstring.h
- 全球及中国HDPE电熔配件行业规模预测及十四五动态发展研究报告2021-2027年版
- 宠物店小程序开发线上预约寄养洗护商城
热门文章
- python 空指针_Python&CType空指针错误
- 华为服务器如何用pe重装系统,教你华为u盘重装win10系统详细图文
- powerpc-linux-gcc,关于powerpc-linux-uclibc-gcc的使用
- http referer 验证防御方法_渗透测试 跨站攻击防御与安全检测手法剖析
- mysql打开无法控制_MySQL不能启动和停止 MySQL各种解决方法教程
- accdb原有的数据怎么清除_VBA中利用数组对数据批量处理的方法
- C++ 学习之旅(1)——编译器Compiler
- Java实现BST搜索树
- [Java基础]字符串中的编码解码问题
- ap计算机科学课程内容,AP计算机科学课程补习有哪些知识点梳理?