分析 [1]无向图 图G的度数矩阵为D,邻接矩阵为A 我们定义这个图的Kirchhoff矩阵为D-A 这个矩阵的任意一个n-1阶主子式的行列式的绝对值就是这个图的生成树个数 [2]有向图 如果要求内向树计数,矩阵是 出度矩阵-邻接矩阵如果要求外向树计数,矩阵是 入度矩阵-邻接矩阵注意有向树计数的时候,删除一行一列,必须删除根所在的行列. 对于这个题我们只需要将一个点与周围的非障碍点连边 然后求无向图的生成树个数即可 代码 #include<iostream> #include<cstdi…
题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个东西.. 无奈去翻题解,,, 发现可以用类似辗转相除法去消,而避免除法,,, 这样子依旧是每次一行减去另一行乘一个数,行列式不变 orz #include<algorithm> #include<iostream> #include<cstring> #include<…
是板子题,因为mod不是质数所以需要辗转相除然而并不知道为啥 高斯消元部分还不知道原理呢--先无脑背过的 #include<iostream> #include<cstdio> using namespace std; const int N=105,dx[]={-1,1,0,0},dy[]={0,0,-1,1},mod=1e9; int n,m,id[N][N],a[N][N],tot; char c[N][N]; bool ok(int x,int y) { return x&…
[BZOJ4031]小Z的房间(矩阵树定理) 题面 BZOJ 洛谷 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙).同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路.现在,你希望统计一共有多…
除法不能用于同余系,要辗转相除.注意不能加入柱子到矩阵. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++ a) #define nR(a,b,c) for(register int a =…
题目大意:有一个$n\times m$的房间,一些位置是房间,另一些位置是柱子,相邻两个房间之间有墙,问有多少种方案可以打通一些墙把所有房间连成一棵树,柱子不可以打通 题解:矩阵树定理,把房间当点,墙当边,一张图的生成树个数为每个点的度数矩阵减去邻接矩阵的任意一个代数余子式的值. 模数是$10^9$,不可以直接高斯消元,可以用辗转相除法来消元 卡点:无 C++ Code: #include <algorithm> #include <cstdio> #include <cst…
题解 题目大意:给定一个无向图,求它的生成树个数. 一道裸的矩阵树定理,外加一些建图的技巧. 矩阵树定理 对于一个 \(Laplace\) 矩阵,其去掉任意一行后的行列式即为答案. 行列式不会的看这里 \(Laplace\) 矩阵是一个无向图的邻接矩阵转化而来的,其中 \(L_{i,i}\) 代表 \(i\) 的度数,\(L_{i,j}\) 代表 \(i->j\) 有多少条路径(准确的说是这些路径的权值和,求生成树时设为 \(1\) ). 至于怎么算,看这里. 那么有了这些知识,我们就可以 \(…
你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着.你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙).同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路.现在,你希望统计一共有多少种可行的方案. 矩阵树求生成树个数模板题 度数矩阵-邻接矩阵=拉普拉斯矩阵 求拉普拉斯矩阵的任意一个代数余子数即可 #define int l…
这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... 找到一个写的特别详细的. il int det() { ; ; i <= sz; ++i) { // 当前在消第i个(i,i) , t; j <= sz; ++j) { // 把它下面对应的位置消成0 while (m[j][i]) { // 直到为0 t = m[i][i] / m[j][i]…
来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着.你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙).同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路.现在,你希望统计…