[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的房间 - 矩阵树定理的主要内容,如果未能解决你的问题,请参考以下文章

[HEOI2015] 小Z的房间 - 矩阵树定理

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

HEOI2015小Z的房间

P4111 [HEOI2015]小Z的房间

BZOJ 4031: [HEOI2015]小Z的房间 Matrix-Tree定理

[HEOI2015] 小Z的房间