【数学一本通 第六章】小z的房间 [LUOGU P4111]

题目:

题目链接:小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;
}

continue……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值