题解 P4111 [HEOI2015]小 Z 的房间
题解
题目大意:给定一个无向图,求它的生成树个数。
一道裸的矩阵树定理,外加一些建图的技巧。
矩阵树定理
对于一个 \(Laplace\) 矩阵,其去掉任意一行后的行列式即为答案。
\(Laplace\) 矩阵是一个无向图的邻接矩阵转化而来的,其中 \(L_{i,i}\) 代表 \(i\) 的度数,\(L_{i,j}\) 代表 \(i->j\) 有多少条路径(准确的说是这些路径的权值和,求生成树时设为 \(1\) )。
至于怎么算,看这里。
那么有了这些知识,我们就可以 \(A\) 了这题。
注意,这题中模数不是质数,不能求逆元,所以我们消元时要用辗转相除法,所以真正的时间复杂度为 \(\mathcal O((nm)^3log_{nm})\)。
Code
\(AC \kern 0.5emCODE:\)
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
inline int read() {
ri x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
}
using IO::read;
namespace nanfeng{
#define int long long
#define cmax(x,y) ((x)>(y)?(x):(y))
#define cmin(x,y) ((x)>(y)?(y):(x))
#define FI FILE *IN
#define FO FILE *OUT
static const int MOD=1e9,N=15;
int id[N][N],G[N*N][N*N],deg[N*N],n,m,cnt,ans=1;
char h[N][N];
inline void add(int u,int v) {G[u][v]=G[v][u]=1;}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
n=read(),m=read();
for (ri i(1);i<=n;p(i)) {
scanf("%s",h[i]+1);
for (ri j(1);j<=m;p(j)) if (h[i][j]=='.') id[i][j]=p(cnt);
}
for (ri i(1);i<=n;p(i)) {
for (ri j(1);j<=m;p(j)) {
if (id[i][j]&&id[i][j-1]) add(id[i][j],id[i][j-1]);
if (id[i][j]&&id[i-1][j]) add(id[i][j],id[i-1][j]);
}
}
for (ri i(1);i<=cnt;p(i)) {
for (ri j(1);j<=cnt;p(j)) if (G[i][j]) p(deg[i]);
}
for (ri i(1);i<=cnt;p(i)) {
for (ri j(1);j<=cnt;p(j)) {
if (i==j) G[i][j]=deg[i];
else G[i][j]=-G[i][j];
}
}
cnt-=1;
for (ri i(1);i<=cnt;p(i)) {//这是高斯消元,要化成三角矩阵,而不要以高斯约旦法消成对角线矩阵。
for (ri j(i+1);j<=cnt;p(j)) {
while(G[j][i]) {
int k=G[i][i]/G[j][i];
for (ri l(i);l<=cnt;p(l)) G[i][l]=(G[i][l]-G[j][l]*k%MOD+MOD)%MOD;
swap(G[i],G[j]);
ans*=-1;
}
}
ans=(ans*G[i][i]%MOD+MOD)%MOD;
} //求行列式
printf("%lld\n",(ans+MOD)%MOD);
return 0;
}
#undef int
}
int main() {return nanfeng::main();}
题解 P4111 [HEOI2015]小 Z 的房间的更多相关文章
- [洛谷P4111][HEOI2015]小Z的房间
题目大意:有一个$n\times m$的房间,一些位置是房间,另一些位置是柱子,相邻两个房间之间有墙,问有多少种方案可以打通一些墙把所有房间连成一棵树,柱子不可以打通 题解:矩阵树定理,把房间当点,墙 ...
- P4111 [HEOI2015]小Z的房间 生成树计数
这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... ...
- P4111 [HEOI2015]小Z的房间
你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着.你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把 ...
- p4111 [HEOI2015]小Z的房间[简述矩阵树定理]
分析 [1]无向图 图G的度数矩阵为D,邻接矩阵为A 我们定义这个图的Kirchhoff矩阵为D-A 这个矩阵的任意一个n-1阶主子式的行列式的绝对值就是这个图的生成树个数 [2]有向图 如果要求内向 ...
- BZOJ 4031: [HEOI2015]小Z的房间 高斯消元 MartixTree定理 辗转相除法
4031: [HEOI2015]小Z的房间 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个 ...
- 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元
[bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...
- 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)
来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...
- bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 98 Solved: 29[Submit][Status] ...
- [HEOI2015]小Z的房间 && [CQOI2018]社交网络
今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...
随机推荐
- 小程序textarea设置maxlength后不是你想的那样简单
可能很多小伙伴们.看见这个标题后; 觉得作者是一个标题党. textarea设置maxlength后, 限制用户输入的字符呗! 还能怎么样呢? 恭喜你,说对了一半. 之前我也一直是这样想的. 知道今天 ...
- vue3后台管理系统(模板)
系统简介 此管理系统是基于Vite2和Vue3.0构建生成的后台管理系统.目的在于学习vite和vue3等新技术,以便于后续用于实际开发工作中: 本文章将从管理系统页面布局.vue路由鉴权.vuex状 ...
- 谈谈Java事务
事务具基本特征(ACID) ① Atomi(原子性):事务中包含的操作被看做一个整,要么完全部成功,要么全部失败. ② Consistency(一致性):事务在完成时,必须是所有的数据都保持一致状态, ...
- 利用漏洞破解win7密码
一.利用5次shift漏洞破解win7密码 1.在未登录系统时,连续按5次shift键,弹出程序:C:\Windows\system32\sethc.exe 2.部分win7及win10可通过系统修复 ...
- 建立属于自己的scrapy crawl模板
本人安装PYTHON3.7安装位置:D:\Python\Python37模板位置:D:\Python\Python37\Lib\site-packages\scrapy\templates\spide ...
- 家庭账本开发day06
编写查询页面,学习layUI的动态表格使用,绑定数据源, table.render({ elem: '#currentTableId', url: '../ ...
- js浮点数保留位数方法封装
大家在平时业务中应该经常跟小数打交道吧,有没有被小数点的保留位数问题搞得头疼啊.比如,保留一位小数,保留俩位小数,保留三位小数,向上取整.四舍五入等等. 而我最近在项目中正好遇到类似的问题:有的地方要 ...
- 深入理解javascript按值传递与按引用传递
https://segmentfault.com/a/1190000012829900
- c语言数据拼包
单片机数据拼包 对于数据包拼包方式常规方式有: 数组 指针 结构体 流 下文将此三种方式分别列举此数据包的实现. 然后对比优缺点. 本文举例数据包协议: 包头 长度Length 消息类型 消息序列号S ...
- 微信小程序云开发-数据库-用户删除数据
一.在商品详情页添加[删除单条数据]按钮 进入goodDetail.wxml页面,添加[删除单条数据]按钮,绑定点击事件removeGood() 二.进入goodDetail.js文件,定义remo ...