[HEOI2015] 小Z的房间 - 矩阵树定理
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HEOI2015] 小Z的房间 - 矩阵树定理相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 105;
const int mod = 1e+9;
namespace mat {
int a[N][N];
int n,p=1;
int Gauss() {
int ans = 1;
for(int i = 1; i < n; i ++) {
for(int j = i + 1; j < n; j ++)
while(a[j][i]) {
int t = a[i][i] / a[j][i];
for(int k = i; k < n; k ++)
a[i][k] = (a[i][k] - t * a[j][k] + mod) % mod;
swap(a[i], a[j]);
ans = - ans;
}
ans = (ans * a[i][i]) % mod;
}
return (ans + mod) % mod;
}
} // namespace mat
int a[N][N],d[N][N],b[N][N],c[N][N],n,m,ind;
char str[N];
int id(int i,int j) {
return c[i][j];
}
int add(int p,int q) {
a[p][q]=a[q][p]=1;
d[p][p]++;
d[q][q]++;
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>str+1;
for(int j=1; j<=m; j++) {
if(str[j]=='.') b[i][j]=0, c[i][j]=++ind;
else b[i][j]=1;
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(b[i][j]==0) {
if(i<n && b[i+1][j]==0) add(id(i,j),id(i+1,j));
if(j<m && b[i][j+1]==0) add(id(i,j),id(i,j+1));
}
}
}
mat::n=ind;
for(int i=1; i<=ind; i++) {
for(int j=1; j<=ind; j++) {
mat::a[i][j]=d[i][j]-a[i][j];
}
}
cout<<mat::Gauss()<<endl;
}
以上是关于[HEOI2015] 小Z的房间 - 矩阵树定理的主要内容,如果未能解决你的问题,请参考以下文章
bzoj4031[HEOI2015]小Z的房间 && bzoj4894天赋 (矩阵树定理)