标签:-- 等于 stdin info ref ++ lazy char har
矩阵树定理是一个受限很窄的定理,基本上题目中有任何其它的限制条件,矩阵树就不是正解(#`-_ゝ-)
但是..但是..人家逼格高啊ˋ( ° ▽、° )
(一) 对于图上的\(n\)个结点,矩阵大小为\(n\times n\)
(二) 对称线\((i,i)\)上的数字,大小为结点\(i\)的度数;非对称线上的点\((i,j)\),若存在边则为\(-1\),无边则为\(0\)
举个小例孑:
余孑式:方阵删除第\(i\)行,第\(j\)列后剩下的行列式的值
主余孑式: 方阵删除第\(i\)行,第\(i\)列后剩下的行列式的值
矩阵树定理:图\(G\)的生成树个数等于该图基尔霍夫矩阵的主余孑式
图论、线性代数..就这么联系起来了..数学的强大ㄟ( ▔, ▔ )ㄏ
比较裸的矩阵树定理,直接套用即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lor(a,b,c) for(register int a=b;a<=c;++a)
#define ror(a,b,c) for(register int a=c;a>=b;--a)
const int MAXB=10,MAX=100;
const ll MOD=1e9;
int n,m,cnt;
char info[MAXB][MAXB];
int ind[MAXB][MAXB],f[MAX][MAX];
ll ans=1;
inline char getc();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
lor(i,1,n) lor(j,1,m) info[i][j]=getc();
lor(i,1,n) lor(j,1,m) ind[i][j]=info[i][j]==‘.‘?++cnt:cnt;
lor(i,1,n) lor(j,1,m) if(info[i][j]==‘.‘){
if(info[i-1][j]==‘.‘){
int u=ind[i-1][j],v=ind[i][j];
f[u][v]=f[v][u]=-1; f[u][u]++; f[v][v]++;
}
if(info[i][j-1]==‘.‘){
int u=ind[i][j-1],v=ind[i][j];
f[u][v]=f[v][u]=-1; f[u][u]++; f[v][v]++;
}
}
cnt--;
lor(i,1,cnt){
int pos=0;
lor(j,i,cnt) if(f[j][i]) {pos=j; break;}
if(!pos) {ans=0; break;}
lor(j,i,cnt) swap(f[i][j],f[pos][j]);
if(i!=pos) ans=-ans;
lor(j,i+1,cnt){
while(f[j][i]){
swap(f[i],f[j]);
ll t=f[j][i]/f[i][i];
lor(k,i,cnt) f[j][k]=((f[j][k]-t*f[i][k])%MOD+MOD)%MOD;
// lor(k,i,cnt) f[j][k]-=t*f[i][k];
ans=-ans;
}
}
ans=((ans*f[i][i]%MOD)+MOD)%MOD;
}
printf("%lld\n",ans);
return 0;
}
inline char getc(){
char tmp=getchar();
while(tmp!=‘.‘&&tmp!=‘*‘) tmp=getchar();
return tmp;
}
标签:-- 等于 stdin info ref ++ lazy char har
原文地址:https://www.cnblogs.com/ticmis/p/13210737.html