[矩阵树]luogu P4111 [HEOI2015]小 Z 的房间

题面

https://www.luogu.com.cn/problem/P4111

分析

矩阵树裸题

一个连通图的生成树个数等于度数矩阵-邻接矩阵的矩阵的行列式

消成上三角求斜对角即可

代码

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
const ll P=1e9;
const int N=11;
int n,m,id[N][N],idcnt;
char s[N][N];
ll ans=1,g[N*N][N*N];

void Add(int u,int v) {g[u][u]++;g[v][v]++;g[u][v]--;g[v][u]--;}

int main() {
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%s",s[i]+1);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            if (s[i][j]=='.') {
                id[i][j]=++idcnt;
                if (s[i-1][j]=='.') Add(id[i][j],id[i-1][j]);
                if (s[i][j-1]=='.') Add(id[i][j],id[i][j-1]);
            }
    for (int i=1;i<idcnt;i++) {
        for (int j=i+1;j<idcnt;j++)
            while (g[j][i]) {
                ll k=g[i][i]/g[j][i];
                for (int l=i;l<idcnt;l++) (g[i][l]+=(P-g[j][l]*k%P))%=P;
                swap(g[i],g[j]);ans*=-1;
            }
        (ans*=g[i][i])%=P;
    }
    printf("%lld\n",(ans+P)%P);
}
View Code

 

posted @ 2021-03-29 19:21  Vagari  阅读(56)  评论(0编辑  收藏  举报