[矩阵树]luogu P4111 [HEOI2015]小 Z 的房间
题面
https://www.luogu.com.cn/problem/P4111
分析
矩阵树裸题
一个连通图的生成树个数等于度数矩阵-邻接矩阵的矩阵的行列式
消成上三角求斜对角即可
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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); }
在日渐沉没的世界里,我发现了你。