图论&数学:矩阵树定理
运用矩阵树定理进行生成树计数
给定一个n个点m条边的无向图,问生成树有多少种可能
直接套用矩阵树定理计算即可
矩阵树定理的描述如下:
首先读入无向图的邻接矩阵,u-v G[u][v]++ G[v][u]++
度数矩阵: u-v D[u][u]++ D[v][v]++;
然后计算图G的基尔霍夫矩阵 C=D-G
接着去掉基尔霍夫矩阵的第i行和第i列(必须都是i,i取任意值)
计算剩下的子矩阵的行列式的值得绝对值即为生成树个数
然后对于有向图来说:
边 u->v G[u][v]++ 然后是D[v][v]++(有向图的度数矩阵指的是入度而不是出度)
这样根据上述步骤计算得来的是树形图的个数
在计算行列式的时候:
先用高斯消元消成上三角矩阵,再把对角线乘起来
(与乘法逆元相关的以后再展开)
下面介绍实现:
const int maxn=;
int A[maxn][maxn],B[maxn][maxn];
double a[maxn][maxn];
int T,n,m;
B是邻接矩阵,A是度数矩阵
a是基尔霍夫矩阵
我们在读入了n之后n--的目的是直接排除最后一行和最后一列将其变成余子式(是叫这个嘛??)
然后是计算行列式:
void gauss()
{
int now=;
for(int i=;i<=n;i++)
{
int j=now;
while(fabs(a[j][now])<eps&&j<=n) j++;
if(j==n+) {puts("");return;}
for(int k=;k<=n;k++) swap(a[now][k],a[j][k]);
for(int j=now+;j<=n;j++)
{
double t=a[j][now]/a[now][now];
for(int k=;k<=n;k++)
a[j][k]-=t*a[now][k];
}
now++;
}
double ans=;
if(n&) ans=-ans;
for(int i=;i<=n;i++) ans*=a[i][i];
printf("%.0lf\n",abs(ans));
}
这里的高斯消元是消成上三角矩阵,然后就方便计算det了
完整的实现如下:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define eps 1e-8
using namespace std;
const int maxn=;
int A[maxn][maxn],B[maxn][maxn];
double a[maxn][maxn];
int T,n,m;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>'') {if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}
return x*f;
}
void gauss()
{
int now=;
for(int i=;i<=n;i++)
{
int j=now;
while(fabs(a[j][now])<eps&&j<=n) j++;
if(j==n+) {puts("");return;}
for(int k=;k<=n;k++) swap(a[now][k],a[j][k]);
for(int j=now+;j<=n;j++)
{
double t=a[j][now]/a[now][now];
for(int k=;k<=n;k++)
a[j][k]-=t*a[now][k];
}
now++;
}
double ans=;
if(n&) ans=-ans;
for(int i=;i<=n;i++) ans*=a[i][i];
printf("%.0lf\n",abs(ans));
}
int main()
{
T=read();
while(T--)
{
memset(A,,sizeof(A));
memset(B,,sizeof(B));
n=read();m=read();
n--;
for(int i=;i<=m;i++)
{
int u=read(),v=read();
u--;v--;
A[u][u]++;A[v][v]++;
B[u][v]++;B[v][u]++;
}
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
a[i][j]=A[i][j]-B[i][j];
}
gauss();
}
return ;
}
图论&数学:矩阵树定理的更多相关文章
- [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)
		
In some countries building highways takes a lot of time... Maybe that's because there are many possi ...
 - BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]
		
传送门 题意: 给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图$K_{n,m}$ 求生成树个数 1 <= n,m,p <= 10^18 显然不能暴力上矩阵树定理 看 ...
 - bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
		
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
 - 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)
		
[LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...
 - 2019.01.02 bzoj2467: [中山市选2010]生成树(矩阵树定理)
		
传送门 矩阵树定理模板题. 题意简述:自己看题面吧太简单懒得写了 直接构建出这4n4n4n个点然后按照题面连边之后跑矩阵树即可. 代码: #include<bits/stdc++.h> # ...
 - [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
		
题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...
 - 【bzoj4596】[Shoi2016]黑暗前的幻想乡  容斥原理+矩阵树定理
		
题目描述 给出 $n$ 个点和 $n-1$ 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 $10^9+7$ 取模. 输入 第一行包含一个正整数 N(N<=17) ...
 - 【BZOJ5133】[CodePlus2017年12月]白金元首与独舞 矩阵树定理
		
[BZOJ5133][CodePlus2017年12月]白金元首与独舞 题面:www.lydsy.com/JudgeOnline/upload/201712/div1.pdf 题解:由于k很小,考虑用 ...
 - CSU 1805 Three Capitals(矩阵树定理+Best定理)
		
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1805 题意: A和B之间有a条边,A和G之间有b条边,B和G之间有c条边.现在从A点出发走遍所 ...
 
随机推荐
- jquery中的$(document).ready()、JavaScript中的window.onload()以及body中的onload()、DomContentLoaded()区别
			
$().ready().$(handler).$(document).ready(handler)均不是原生JS中的,都是jQuery中封装的方法.这些事件在当页面的dom节点加载完毕后就执行,无需等 ...
 - 适合初学者的嵌入式Linux计划
			
俗话说万事开头难,刚开始的时候,你是否根本就不知如何开始,上网查资料被一堆堆新名词搞的找不到北,去图书馆看书也是找不到方向?又是arm,又是linux,又是uboot头都大了,不知道自己究竟从哪里开始 ...
 - c#事件实质
			
c#的事件实际上是对windows消息的封装: windows消息系统分为3部分:消息队列,消息循环,窗口过程(wndproc函数)
 - Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题
			
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...
 - 【转】自定义(滑动条)input[type="range"]样式
			
1.如何使用滑动条? 用法很简单,如下所示: <input type="range" value="0"> 各浏览器原始样式如下: Chrome: ...
 - MVC 上传文件实例
			
http://www.cnblogs.com/leiOOlei/archive/2011/08/17/2143221.html
 - RT-thread内核之事件
			
一.事件控制块:在include/rtdef.h中 #ifdef RT_USING_EVENT /** * flag defintions in event */ #define RT_EVENT_F ...
 - set类型没有单独取值功能 通过循环取值
			
set类型没有单独取值功能 通过循环取值
 - BZOJ 1875 HH去散步(矩阵快速幂)
			
题意: 给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数. 每一步走的时候要求不能走上一条刚刚走的路. 解析: 显然需要搞出个矩阵之后矩乘. 然 ...
 - 【bzoj3174】[Tjoi2013]拯救小矮人  贪心+dp
			
题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...