小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. T分布、卡方分布、F分布

    请参考: https://www.cnblogs.com/think-and-do/p/6509239.html

  2. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

  3. java堆内存模型

     广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generation). 年轻代 年轻代是所有新对象产生的地方.当年轻代内存空间被用完时,就会触发垃 ...

  4. 位运算 & 网络序字节序

    一.初识位运算 位运算,见词明意,二进制运算,通常需要将运算数转换为二进制再进行处理,如果是在程序语言中则无需自己进行进制转换,基本的位操作符有如下几种:与(&).或(|).异或(^).取反( ...

  5. iOS中的数据库应用

    iOS中的数据库应用 SLQLite简介 什么是SQLite SQLite是一款轻型的嵌入式数据库 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 它的处理速度比Mysql.Post ...

  6. python程序设计——基本语言特性

    参考<Python程序设计(第2版)> 清华大学出版社 董付国 ##### 除特殊说明外,以下代码示例,均为python 3.6版本 ##### 一.Python语言特性 1.python ...

  7. python基础训练营06

    任务六 时长: 啥是佩奇代码复现 参考链接:https://mp.weixin.qq.com/s/whtJOrlegpWzgisYJabxOg 画一只佩奇: 代码: from turtle impor ...

  8. Leetcode 680.验证回文字符串

    验证回文字符串 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca&q ...

  9. [PocketFlow]解决TensorFLow在COCO数据集上训练挂起无输出的bug

    1. 引言 因项目要求,需要在PocketFlow中添加一套PeleeNet-SSD和COCO的API,具体为在datasets文件夹下添加coco_dataset.py, 在nets下添加pelee ...

  10. UVA 11882 Biggest Number(搜索+剪枝)

    You have a maze with obstacles and non-zero digits in it: You can start from any square, walk in the ...