题目:
题目链接:小z的房间
题解:
建图 + Matrix-tree板子。
代码:
#include<bits/stdc++.h>
#define LL long long
#define mod 1000000000
using namespace std;
const int sea=15;
char s[sea][sea];
int a[110][110],t[sea][sea];
int f[sea][sea],d[sea],n,m,tot=0;
inline int read()
{
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1; ch=getchar();}
while(ch<='9'&&ch>='0')s=s*10+ch-'0',ch=getchar();
return s*w;
}
//void add(int x,int y){f[x][y]=1;f[y][x]=1;d[x]++;d[y]++;}
void add(int x,int y){--a[x][y]; --a[y][x],++a[x][x],++a[y][y];} //在写add的时候,就被hsm吐槽了,然后我就换了一种写法,突然觉得这样还挺妙的
int det(int tot)
{
LL ans=1;
for(int i=1;i<=tot;i++)
{
for(int j=i+1;j<=tot;j++)
while(a[j][i])
{
int ins=a[i][i]/a[j][i];
for(int k=i;k<=tot;k++) a[i][k]=(a[i][k]-1LL*a[j][k]*ins%mod+mod)%mod;
swap(a[i],a[j]); ans=-ans;
}
ans=1LL*ans*a[i][i]%mod,ans=(ans+mod)%mod;//跟之前的板子比,多了项要%的操作
}
return ans;
}
int main()
{
n=read(); m=read();
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]=='.')
{
t[i][j]=++tot;
if(s[i][j-1]=='.') add(t[i][j-1],t[i][j]);
if(s[i-1][j]=='.') add(t[i-1][j],t[i][j]);
}
printf("%d\n",det(tot-1));//还不是因为字符串+1
return 0;
}