矩阵树定理
Posted ticmis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵树定理相关的知识,希望对你有一定的参考价值。
数论 矩阵树定理
0.1 简介
矩阵树定理是一个受限很窄的定理,基本上题目中有任何其它的限制条件,矩阵树就不是正解(#`-_ゝ-)
但是..但是..人家逼格高啊ˋ( ° ▽、° )
1.1 基尔霍夫矩阵
(一) 对于图上的(n)个结点,矩阵大小为(n imes n)
(二) 对称线((i,i))上的数字,大小为结点(i)的度数;非对称线上的点((i,j)),若存在边则为(-1),无边则为(0)
举个小例孑:
2.1 矩阵树定理
余孑式:方阵删除第(i)行,第(j)列后剩下的行列式的值
主余孑式: 方阵删除第(i)行,第(i)列后剩下的行列式的值
矩阵树定理:图(G)的生成树个数等于该图基尔霍夫矩阵的主余孑式
图论、线性代数..就这么联系起来了..数学的强大ㄟ( ▔, ▔ )ㄏ
3.1 例题:[HEOI2015]小Z的房间
比较裸的矩阵树定理,直接套用即可
#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
",ans);
return 0;
}
inline char getc(){
char tmp=getchar();
while(tmp!=‘.‘&&tmp!=‘*‘) tmp=getchar();
return tmp;
}
以上是关于矩阵树定理的主要内容,如果未能解决你的问题,请参考以下文章