小Z的房间

Time Limit: 10 Sec  Memory Limit: 256 MB
[Submit][Status][Discuss]

Description

  你突然有了一个大房子,房子里面有一些房间。事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子。在一开始的时候,相邻的格子之间都有墙隔着。
  你想要打通一些相邻房间的墙,使得所有房间能够互相到达。在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙)。同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路。现在,你希望统计一共有多少种可行的方案。

Input

  第一行两个数分别表示n和m。
  接下来n行,每行m个字符,每个字符都会是’.’或者’*’,其中’.’代表房间,’*’代表柱子。

Output

  一行一个整数,表示合法的方案数 Mod 10^9

Sample Input

  3 3
  ...
  ...
  .*.

Sample Output

  15

HINT

  n,m<=9

Main idea

  给定n*m的矩形,由0和1构成,每个相邻的0点可连边,询问有几种连边方案使得0点两两相通且路径唯一。

Solution

  显然想到了题目要求求的就是生成树计数。我们运用Matrix-Tree定理,求出根据Matrix-Tree定理得到的行列式的值即可。关于行列式有如下三条性质,根据②③两条性质,类似高斯消元一样处理就可以得到行列式的值,该值即为最终答案。
  PS(重点):

  (1) Matrix-Tree定理:Kirchhoff矩阵去掉任意一行和任意一列得到的行列式的值=生成树计数,其中Kirchhoff矩阵=“度数矩阵”-“邻接矩阵”。(为了方便处理,通常去掉Kirchhoff矩阵的第n行与第n列)
  (2) 行列式的性质:
  ① 行列式的值等于只有对角线不为0时对角线的乘积;
  ② 交换行列式的其中任意两行之后(行列式的值)*-1;
  ③ 用行列式的一行减去[另一行*(一个系数)],行列式的值不变。

Code

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std; const int ONE=;
const int MOD=1e9; int n,m;
char ch[ONE];
long long a[ONE][ONE];
int Bian[ONE][ONE],tot;
int dx[]={,,,-};
int dy[]={,,-,}; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} long long HLS_value(int n)
{
int PD=;
long long Ans=; for(int Now=;Now<=n;Now++)
{
for(int i=Now+;i<=n;i++)
{
long long A=a[Now][Now],B=a[i][Now];
while(B!=)
{
long long t=A/B;
for(int j=Now;j<=n;j++) a[Now][j]=(long long)(a[Now][j]-(long long)t*a[i][j]%MOD+MOD) % MOD;
for(int j=Now;j<=n;j++) swap(a[Now][j],a[i][j]);
A%=B; swap(A,B); PD=-PD;
}
} if(!a[Now][Now]) return ;
Ans=Ans*a[Now][Now]%MOD;
}
return (PD*Ans+MOD) % MOD;
} int main()
{
n=get(); m=get();
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
for(int j=;j<=m;j++)
if(ch[j]=='.') Bian[i][j]=++tot;
} for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(Bian[i][j])
{
for(int k=;k<=;k++)
{
int x=i+dx[k],y=j+dy[k],u=Bian[i][j],v=Bian[x][y];
if(!v) continue;
if(x< || x>n || y< || y>m)continue;
a[v][v]=(a[v][v]+) % MOD;
a[u][v]=(a[u][v]-+MOD) % MOD;
}
}
printf("%lld",HLS_value(tot-)); }

【BZOJ4031】【HEOI2015】小Z的房间 [Matrix-Tree][行列式]的更多相关文章

  1. BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)

    题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...

  2. BZOJ 4031: [HEOI2015]小Z的房间(Matrix Tree)

    传送门 解题思路 矩阵树定理模板题.矩阵树定理是求图中最小生成树个数,做法是首先求出基尔霍夫矩阵,就是度数矩阵\(-\)邻接矩阵.然后再求出这个矩阵的行列式,行列式的求法就是任意去掉一行一列,然后高斯 ...

  3. bzoj4031 [HEOI2015]小Z的房间

    Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...

  4. BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】

    题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...

  5. bzoj4031 [HEOI2015]小Z的房间——矩阵树定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 矩阵树定理的模板题(第一次的矩阵树定理~): 有点细节,放在注释里了. 代码如下: # ...

  6. 【bzoj4031】[HEOI2015]小Z的房间 解题报告

    [bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...

  7. 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元

    [bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...

  8. 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)

    来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...

  9. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

  10. [HEOI2015]小Z的房间 && [CQOI2018]社交网络

    今天看了一下矩阵树定理,然后学了一下\(O(n ^ 3)\)的方法求行列式. 哦对了,所有的证明我都没看-- 这位大佬讲的好呀: [学习笔记]高斯消元.行列式.Matrix-Tree 矩阵树定理 关于 ...

随机推荐

  1. jenkins使用Role Strategy管理用户权限

    下载插件地址:https://wiki.jenkins.io/display/JENKINS/Role+Strategy+Plugin 1. 安装好插件后,进入jenkins系统管理的Configur ...

  2. Eclipse AmaterasUML 安装及使用

    AmaterasUML 对于我来说,是一个非常好用的UML插件. 用它来将我写过的一些Android程序进行逆工程非常好用,只不过,不能体现出包,这是一个小小的遗憾. 这个是它的主页地址:http:/ ...

  3. ios下 active 演示激活

    document.body.addEventListener('touchstart', function () { });

  4. 自动化测试---mybatis的使用

    mybatis如何实现了对数据库的操作: 1.通过Resources.getResourceAsReader()或者 Resources.getResourceAsStream()加载mybatis. ...

  5. iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计

    本节主要讲解如何创建无限循环Endless的星空背景(如下图).玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌 ...

  6. POJ 3858 Hurry Plotter(DP)

    Description A plotter is a vector graphics printing device that connects to a computer to print grap ...

  7. winform 根据两点求出线上所有点及画出这条线

    找出所有点: 根据斜率按照一个方向递增,求出对应的另一个方向的整数值. Point pStart = new Point(0, 2); Point pEnd = new Point(8, 2); // ...

  8. python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  9. Linux arm64内核启动

    原创翻译,转载请注明出处. arm64的异常模型由一组异常级别(EL0-EL3)组成.EL0,EL1有安全模式和非安全模式的区别.EL2是虚拟机管理级别并且只有非安全模式.EL3是最高优先级并且只存在 ...

  10. java课程设计——2048

    1.团队介绍 2.项目git地址 [https://gitee.com/SMTwula/java036.git] 3.项目git提交记录截图 沈梦婷 田亚琴 4.项目功能架构图与主要功能流程图 5.项 ...