MatrixTree速成
前言
MatrixTree定理是用来解决生成树计数问题的有利工具
比如说这道题
MatrixTree定理的算法流程也非常简单
我们记矩阵\(A\)为无向图的度数矩阵
记矩阵\(D\)为无向图的邻接矩阵
\(A\)矩阵是除了对角线之外各个点值都为\(0\)的矩阵,\(A[i][i]\)表示\(i\)号点的度数
\(D\)矩阵记录两点之间的度数,\(D[i][j]\)表示\(i\)号点与\(j\)号点之间的边数
MatrixTree定理
我们记矩阵\(G=A-D\)
那么\(G\)的所有不同生成树的个数等于\(G\)的任何一个 \(n-1\) 阶主子式的行列式的绝对值
实现
MatrixTree定理的实现非常简单
- 计算出\(G\)矩阵
- 后对其进行高斯消元
- 把消元后的矩阵的对角线乘起来
- 输出
代码
就是上面那道题目的代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=3001;
const double eps=1e-12;
inline int read()
{
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
double G[MAXN][MAXN],a[MAXN][MAXN];
char s[MAXN][MAXN];
int xx[5]={0,-1,+1,0,0};
int yy[5]={0,0,0,-1,+1};
int N,M;
int dcmp(int x)
{
if(x<=eps||x>=-eps) return 0;
else return x<0?-1:1;
}
void Gauss()
{
N--;
for(int i=1;i<=N;i++)//每一行
{
int mx=i;
for(int j=i+1;j<=N;j++)//下面的每一行
if(dcmp(G[mx][i]-G[j][i])<0) mx=j;
if(mx!=i) swap(G[i],G[mx]);
if(!G[i][i]) {printf("0\n");return ;}
for(int j=i+1;j<=N;j++)
{
double t=G[j][i]/G[i][i];
for(int k=i;k<=N+1;k++)
G[j][k]-=t*G[i][k];
}
}
double ans=1;
for(int i=1;i<=N;i++) ans=ans*G[i][i];
printf("%.0f\n",abs(ans));
}
int main()
{
int T=read();
while(T--)
{
memset(G,0,sizeof(G));
N=read(),M=read();
for(int i=1;i<=M;i++)
{
int x=read(),y=read();
G[x][x]++;G[y][y]++;
G[x][y]--;G[y][x]--;
}
Gauss();
}
return 0;
}
MatrixTree速成的更多相关文章
- 《LoadRunner12七天速成宝典》来了
看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...
- Java正则速成秘籍(一)之招式篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- Java正则速成秘籍(二)之心法篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- Java正则速成秘籍(三)之见招拆招篇
导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...
- 【小白的CFD之旅】08 CFD速成之道
学了那么一个星期的流体力学,又看了一周的计算流体力学,小白对于如何应用CFD解决工程流体问题,依然是一无所知.眼看一个月的时间已经过半,小白有点着急起来.于是在一个阳光明媚的早晨,小白又找到了黄师姐. ...
- SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元
[题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...
- matrix-tree
学一发matrix-tree 原来bzoj1016这题是暴搜+玄学并查集过的-数据弱怪我咯 首先matrix-tree需要度数矩阵D,就是说当i=j时D[i][j]为i的度数,否则为0. 还有邻接矩阵 ...
- 一个简单的html5页面在线速成工具!(当然本文主要说下他的成果的结构)
分享一个好玩的web app页面速成工具 当然主要是让大家看下他的原理 看着他的结构大家就该猜到这个了.这个是利用换页之后给当前div加了一个active,然后利用css控制效果 这个毫无疑问是采用最 ...
- 高手速成android开源项目【导航篇】
Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧和创造力.学习开源代码是掌握技术的一个 ...
随机推荐
- 剑指offer【书】之简历抒写
项目介绍1.剪短的项目背景简短的项目背景,比如项目的规模,开发的软件的功能.目标用户等2.完成的任务这个要写详细,要让面试官对自己的工作一目了然.在用词上要注意区分“参与”和“负责”:如果只就用“负责 ...
- 算法与数据结构(七) AOV网的拓扑排序(Swift版)
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 使用Sublime Text 或 vs2017开发Node.js程序
在学习一门开发语言时,为了从简单的方式入手,有时候直接用Notepad开始敲代码.曾经我也这样干过,这样做简洁而不简单啊! 随着时间的流逝,人也变得懒惰起来,做事前总是想借助一些工具来搞事情.< ...
- MySQL 的分页查询 SQL 语句
MySQL一般使用 LIMIT 实现分页.基本语句为: SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... 在中小数据量的情况下,这样的SQL足够 ...
- [Swift]LeetCode122. 买卖股票的最佳时机 II | Best Time to Buy and Sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- [Swift]LeetCode264.丑数 II | Ugly Number II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [Swift]LeetCode1008. 先序遍历构造二叉树 | Construct Binary Search Tree from Preorder Traversal
Return the root node of a binary search tree that matches the given preorder traversal. (Recall that ...
- 在 ns-3.25中添加 plc(电力线载波) 模块
上一篇安装好了 ns-3.25,这里继续往里添加 plc 模块.整理之前现推荐一个网站,大家可以参考. 英属哥伦比亚大学(University of British Columbia,UBC)提供NS ...
- 想成为Python全栈开发工程师必须掌握的技能
什么是Python全栈工程师? 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念 也分很多种类 真正的全栈工程师涵盖了we ...
- idea设置代码颜色主题(同Sublime Text 3的代码颜色一样)
1.下载主题的网址:http://color-themes.com,主题种类多,总有适合你的主题.在这个网址下载的主题是jar文件,直接导入,如下图file->import Setting,找 ...