BZOJ 4031 [HEOI2015]小Z的房间(Matrix-Tree定理)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=4031
【题目大意】
你突然有了一个大房子,房子里面有一些房间。
事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,
每个格子是一个房间或者是一个柱子。在一开始的时候,相邻的格子之间都有墙隔着。
你想要打通一些相邻房间的墙,使得所有房间能够互相到达。
在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙)。
同时,你不希望在房子中有小偷的时候会很难抓,
所以你希望任意两个房间之间都只有一条通路。现在,你希望统计一共有多少种可行的方案。
【题解】
根据任意两个房间之间只有一条通路我们可以知道这题要求的是生成树的方案数,
那么我们先求出这个图的基尔霍夫矩阵,然后求余子式就是答案,处理一下取模即可。
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
#define rep(i,n,m) for(int i=n;i<=m;i++)
const LL mod=1000000000;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int n,m,id;
char mp[110][110];
LL a[110][110],p[110][110];
int det(int n){
LL ans=1,f=1;
rep(i,1,n)rep(j,1,n)a[i][j]=(a[i][j]+mod)%mod;
rep(i,1,n){
rep(j,i+1,n){
LL A=a[i][i],B=a[j][i];
while(B!=0){
LL t=A/B; A%=B; swap(A,B);
for(int k=1;k<=n;k++)a[i][k]=(a[i][k]-t*a[j][k]%mod+mod)%mod;
for(int k=1;k<=n;k++)swap(a[i][k],a[j][k]);
f=-f;
}
}if(!a[i][i])return 0;
ans=ans*a[i][i]%mod;
}if(f==-1)return (mod-ans)%mod;
return ans;
}
bool check(int x,int y){if(x<1||y<1||x>n||y>m||mp[x][y]!='.')return 0;return 1;}
int main(){
scanf("%d%d",&n,&m);
rep(i,1,n)scanf("%s",mp[i]+1);
rep(i,1,n)rep(j,1,m)if(mp[i][j]=='.')p[i][j]=++id;
rep(i,1,n)rep(j,1,m)if(mp[i][j]=='.'){
rep(k,0,4){
int x=i+dx[k],y=j+dy[k];
if(check(x,y)){int u=p[i][j],v=p[x][y];a[u][u]++;a[u][v]--;}
}
}printf("%d\n",det(id-1));
return 0;
}
BZOJ 4031 [HEOI2015]小Z的房间(Matrix-Tree定理)的更多相关文章
- BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...
- BZOJ 4031: [HEOI2015]小Z的房间(Matrix Tree)
传送门 解题思路 矩阵树定理模板题.矩阵树定理是求图中最小生成树个数,做法是首先求出基尔霍夫矩阵,就是度数矩阵\(-\)邻接矩阵.然后再求出这个矩阵的行列式,行列式的求法就是任意去掉一行一列,然后高斯 ...
- BZOJ 4031: [HEOI2015]小Z的房间 [矩阵树定理 行列式取模]
http://www.lydsy.com/JudgeOnline/problem.php?id=4031 裸题........ 问题在于模数是$10^9$ 我们发现消元的目的是让一个地方为0 辗转相除 ...
- BZOJ 4031: [HEOI2015]小Z的房间 (矩阵树定理 板题)
背结论 : 度-邻 CODE1 O(n3logn)O(n^3logn)O(n3logn) #include <bits/stdc++.h> using namespace std; typ ...
- bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 98 Solved: 29[Submit][Status] ...
- BZOJ 4031: [HEOI2015]小Z的房间 高斯消元 MartixTree定理 辗转相除法
4031: [HEOI2015]小Z的房间 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个 ...
- 【刷题】BZOJ 4031 [HEOI2015]小Z的房间
Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...
- BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...
- BZOJ 4031: [HEOI2015]小Z的房间 Matrix-Tree定理
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 题解: Matrix-tree定理解决生成树计数问题,其中用到高斯消元法求上三角矩 ...
随机推荐
- Linux系统网络基础知识及配置
一:DNS(domain name system)简介 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而 ...
- 所有和Java中代理有关的知识点都在这了。
对于每一个Java开发来说,代理这个词或多或少都会听说过.你可能听到过的有代理模式.动态代理.反向代理等.那么,到底什么是代理,这么多代理又有什么区别呢.本文就来简要分析一下. 代理技术,其实不只是J ...
- NightMare2(SCU4527+dijkstra+二分)
题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4527 题目: 题意:最短路的每条边除了边权之外还会有一个限制(财富,身上带的财富大于这个值则不能通 ...
- 取石子游戏 HDU2516(斐波那契博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 题目: Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任 ...
- Gulp、Grunt构建工具
在Gulp中创建一个库从磁盘gulp.src读取源文件并通过磁盘管道写回内容到gulp.dest,可以理解成只是将文件复制到另一个目录. var gulp = require('gulp'); gul ...
- cookie、session、localstorage
最早的Cookies问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了.优势就是大家都支持,而且支持得还蛮好.cookie的内容主要包括:名字,值,过期时间, ...
- perl操作MongoDB
perl操作MongoDB http://blog.csdn.net/jophyyao/article/details/8223190 Mongodb 的C语言操作 http://blog.csdn. ...
- 2015多校第9场 HDU 5405 Sometimes Naive 树链剖分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5405 题意: 给你一棵n个节点的树,有点权. 要求支持两种操作: 操作1:更改某个节点的 ...
- 方便大家学习的Node.js教程(一):理解Node.js
理解Node.js 为了理解Node.js是如何工作的,首先你需要理解一些使得Javascript适用于服务器端开发的关键特性.Javascript是一门简单而又灵活的语言,这种灵活性让它能够经受住时 ...
- [New Learn]被嫌弃的app的一生
1.简介 为什么叫被嫌弃的app的一生?致敬电影<被嫌弃的松子的一生>. 自学IOS东一锄西一镐的总感觉没有一个总的概念,还是多看看官网吧,先看一下一个app的整个生命周期,本文主要是翻译 ...