【bzoj4031】[HEOI2015]小Z的房间
题解:
矩阵树定理入门题
一个图的邻接矩阵G:对于无向图的边(u,v),G[u][v]++,G[v][u]++
一个图的度数矩阵D:对于无向图的边(u,v),D[u][u]++,D[v][v]++;
而通过这两个矩阵就可以构造出图G的基尔霍夫矩阵:C=D-G.
Matrix Tree定理:将图G的基尔霍夫矩阵去掉第i行和第i列(i可以取任意值,可以证明所得到的结果相同),得到(n-1)*(n-1)的矩阵
Part 2 Matrix Tree定理在有向图上的拓展
Matrix Tree定理的拓展与延伸------有向图的Matrix Tree定理
对于有向图G,不存在生成树的概念,但存在树形图的概念。
树形图:以i点为根节点的树形图有(n-1)条边,从i节点出发可以到达其他所有(n-1)个节点.
定义: 有向图的邻接矩阵G:对于有向图的边(u,v),G[u][v]++.
有向图的度数矩阵D:对于有向图的边(u,v),D[v][v]++.
尤其需要注意的是:有向图的度数矩阵指的是一个点的入度,而不是出度。
而有向图的基尔霍夫矩阵的构造方式是一模一样的:C=D-G.
有向图Matrix Tree定理:
将有向图G的基尔霍夫矩阵去掉第i行和第i列,得到(n-1)*(n-1)的矩阵,
对这个矩阵进行行列式的值求解,abs(det(A))就是以i为根的树形图的个数。
行列式相关结论:
行列式与它的转置行列式相等;
互换行列式的两行(列),行列式变号;
行列式的某一行(列)的所有的元素都乘以同一数k,等于用数k乘此行列式;
行列式如果有两行(列)元素成比例,则此行列式等于零;
若行列式的某一列(行)的元素都是两数之和,则这个行列式是对应两个行列式的和;
把行列式的某一列(行)的各元素乘以同一数然后加到另一列(行)对应的元素上去,行列式不变
在求解行列式时,我们利用高斯消元将其变为上三角矩阵,答案就是pai(a[i][i])
另外注意到高斯消元中有除法运算,但是这题中的模数并没有逆元,所以我们用辗转相除来减
另外注意到交换两行符号变号要记录一下
另外不是房间的点不要算
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rint register ll
const ll mo=1e9;
char ss[<<],*A=ss,*B=ss;
char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T> void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=c^;
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^);
}
ll n,m,s;
ll a[][],ff[][];
ll guass()
{
s--;
int cnt=;
for (ll i=;i<=s;i++)
{
/* ll now=i;
for (ll j=i+1;j<=s;j++)
if (abs(a[j][i])>abs(a[now][i])) now=j;
if (now!=i)
for (ll j=1;j<=s;j++) swap(a[i][j],a[now][j]); */
for (ll j=i+;j<=s;j++)
while (a[j][i])
{
ll kk=a[i][i]/a[j][i];
for (ll k=;k<=s;k++) a[i][k]=(a[i][k]-kk*a[j][k])%mo;
for (ll k=;k<=s;k++) swap(a[i][k],a[j][k]);
cnt++;
}
}
ll ans=; if (cnt%) ans=-;
for (ll i=;i<=s;i++)
ans=(ans*a[i][i])%mo;
return (ans+mo)%mo;
}
ll js(ll x,ll y)
{
return(ff[x][y]);
}
void cl(ll x1,ll y1,ll x2,ll y2)
{
ll k1=js(x1,y1),k2=js(x2,y2);
a[k1][k2]--; a[k2][k2]++;
}
char c[][];
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>m;
for (ll i=;i<=n;i++) cin>>c[i];
int num=;
for (ll i=;i<=n;i++)
for (ll j=;j<=m;j++)
if (c[i][j-]=='.') ff[i][j]=++num;
for (ll i=;i<=n;i++)
for (ll j=;j<=m;j++)
{
if (i!=n)
if (c[i][j-]=='.'&&c[i+][j-]=='.')
cl(i,j,i+,j);
if (i!=)
if (c[i][j-]=='.'&&c[i-][j-]=='.')
cl(i,j,i-,j);
if (j!=m)
if (c[i][j-]=='.'&&c[i][j]=='.')
cl(i,j,i,j+);
if (j!=)
if (c[i][j-]=='.'&&c[i][j-]=='.')
cl(i,j,i,j-);
}
s=num;
/*for (int i=1;i<=s-1;i++)
{
cout<<endl;
for (int j=1;j<=s-1;j++)
cout<<a[i][j]<<" ";
}
cout<<endl;*/
cout<<guass();
/* for (int i=1;i<=s;i++)
{
cout<<endl;
for (int j=1;j<=s;j++)
cout<<a[i][j]<<" ";
}
cout<<endl;*/
return ;
}
【bzoj4031】[HEOI2015]小Z的房间的更多相关文章
- bzoj4031 [HEOI2015]小Z的房间
Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...
- BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】
题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...
- bzoj4031 [HEOI2015]小Z的房间——矩阵树定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 矩阵树定理的模板题(第一次的矩阵树定理~): 有点细节,放在注释里了. 代码如下: # ...
- 【bzoj4031】[HEOI2015]小Z的房间 解题报告
[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...
- 【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 矩阵树定理 关于 ...
- 【BZOJ-4031】小z的房间 Matrix-Tree定理 + 高斯消元解行列式
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 937 Solved: 456[Submit][Statu ...
- 【BZOJ 4031】 4031: [HEOI2015]小Z的房间 (Matrix-Tree Theorem)
4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1089 Solved: 533 Description ...
随机推荐
- C# 操作文件类,文件夹存在判断,创建,文件内容读写。
此篇文档是老早就放到草稿箱中了,断断续续编辑了几次.结合自己经常用到的对于文件的操作,结合msdn做此文. 1.File 类 --转自msdn 常用方法: 名称 说明 AppendAllLines(S ...
- latex公式、编号、对齐
原文地址:http://blog.csdn.net/hjq376247328/article/details/49718931 LaTeX的数学公式有两种,即行中公式和独立公式.行中公式放在正文中间, ...
- Linux基础知识之bashrc和profile的用途和区别
使用终端ssh登录Linux操作系统的控制台后,会出现一个提示符号(例如:#或~),在这个提示符号之后可以输入命令,Linux根据输入的命令会做回应,这一连串的动作是由一个所谓的Shell来做处理. ...
- 一种简单的生产环境部署Node.js程序方法
最近在部署Node.js程序时,写了段简单的脚本,发觉还挺简单的,忍不住想与大家分享. 配置文件 首先,本地测试环境和生产环境的数据库连接这些配置信息是不一样的,需要将其分开为两个文件存储 到conf ...
- UniversalImageLoader(异步加载大量图片)
UniversalImageLoader是用于加载图片的一个开源项目,UniversalImageLoader是实现异步加载大量图片的源码和例子,包括缓存.硬盘缓存.容错机制等技术.在其项目介绍中是这 ...
- 模块 -- 序列化 hashlib sha logging (加密 加盐 )
模块: 一个py文件就是一个模块 模块分类: 1:内置模块,登录模块,时间模块,sys模块,os模块等等 2: 扩展模块, 3:自定义模块,自己写的py文件 python 开发效率之高:python ...
- 洛谷P4451 [国家集训队]整数的lqp拆分 [生成函数]
传送门 题意简述:语文不好不会写,自己看吧 思路如此精妙,代码如此简洁,实是锻炼思维水经验之好题 这种题当然是一眼DP啦. 设\(dp_n\)为把\(n\)拆分后的答案.为了方便我们设\(dp_0=1 ...
- LeetCode(91):解码方法
Medium! 题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计 ...
- java多线程机制中的Thread和Runnable()区别
1.java语言使用Thread类及其子类对象来表示线程,新建的一个线程声明周期中经历 新建.(声明一个线程,此时他已经有了相应的内存空间和其他资源),运行(线程创建之久就据用了运行的条件,一旦轮到使 ...
- Fiddler抓包6-get请求(url详解)
前言 上一篇介绍了Composer的功能,可以模拟get和post请求,get请求有些是不带参数的,这种比较容易,直接放到url地址栏就行.有些get请求会带有参数,本篇详细介绍url地址格式. 一. ...