矩阵树定理

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的房间

P4111 [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;
}

以上是关于矩阵树定理的主要内容,如果未能解决你的问题,请参考以下文章

「矩阵树定理」

初学矩阵树定理

算法Matrix - Tree 矩阵树定理 & 题目总结

矩阵树定理

浅谈矩阵树定理

Matrix-Tree 定理(基尔霍夫矩阵树定理)