【Matrix-tree Theorem学习笔记】
定义度数矩阵\(D(G)\):
定义邻接矩阵\(C(G)\):
定义\(Laplace\)矩阵\(A\)
\(
A(G) = D(G) - C(G)
\)
记图\(G\)的所有生成树权值和为\(t(G)\)
一颗树形结构的权值为该树所有边权的积
无向图情况:
如果存在一条边\((x,y,w)\)
则\(D_{x,x},D_{y,y} += w\)
则\(C_{x,y},C_{y,x} += w\)
则\(A\)删除根节点对应的行和列,剩下的\(n - 1\)阶主子式则是权值之和
有向图情况:
如果存在一条边\((x,y,w)\)
如果统计根向树形图则\(D_{x,x} += w\)
如果统计外向树形图则\(D_{y,y} += w\)
两种情况都为
\(C_{x,y} += w\)

权设为\(1\)则可以统计生成树个数。
矩阵树
#include<iostream>
#include<cstdio>
#define ll long long
#define N 305
#define mod 1000000007
#define inv(x) (fpow(x,mod - 2))
ll n,m,typ;
ll a[N][N];
ll fpow(ll x,ll k){
ll ans = 1;
while(k){
if(k & 1)
ans = ans * x % mod;
x = x * x % mod;
k >>= 1;
}
return ans;
}
void del(int r){
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j){
if(i != r && j != r){
ll x = i > r ? i - 1 : i;
ll y = j > r ? j - 1 : j;
a[x][y] = a[i][j];
}
}
}
ll det(){
ll ans = 1;
for(int i = 1;i <= n;++i){
if(!a[i][i]){
for(int j = i + 1;j <= n;++j){
if(a[j][i]){
for(int k = 1;k <= n;++k)
std::swap(a[i][k],a[j][k]);
ans -= ans;
break;
}
}
}
ll t = inv(a[i][i]);
for(int j = i + 1;j <= n;++j){
ll f = a[j][i] * t % mod;
for(int k = i;k <= n;++k)
a[j][k] = (a[j][k] - a[i][k] * f % mod) % mod;
}
}
for(int i = 1;i <= n;++i)
ans = ans * a[i][i] % mod;
return (ans % mod + mod) % mod;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&typ);
ll x,y,z;
for(int i = 1;i <= m;++i){
scanf("%lld%lld%lld",&x,&y,&z);
if(x != y){
if(typ == 0){
a[x][x] = (a[x][x] + z) % mod,a[y][y] = (a[y][y] + z) % mod;
a[x][y] = (a[x][y] - z) % mod,a[y][x] = (a[y][x] - z) % mod;
}else{
a[y][y] = (a[y][y] + z) % mod;
a[x][y] = (a[x][y] - z) % mod;
}
}
}
del(1);
n -= 1;
std::cout<<det()<<std::endl;
}
【Matrix-tree Theorem学习笔记】的更多相关文章
- 【机器学习】决策树(Decision Tree) 学习笔记
[机器学习]决策树(decision tree) 学习笔记 标签(空格分隔): 机器学习 决策树简介 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个 ...
- 树上启发式合并(dsu on tree)学习笔记
有丶难,学到自闭 参考的文章: zcysky:[学习笔记]dsu on tree Arpa:[Tutorial] Sack (dsu on tree) 先康一康模板题吧:CF 600E($Lomsat ...
- [dsu on tree]【学习笔记】
十几天前看到zyf2000发过关于这个的题目的Blog, 今天终于去学习了一下 Codeforces原文链接 dsu on tree 简介 我也不清楚dsu是什么的英文缩写... 就像是树上的启发式合 ...
- 设备树(device tree)学习笔记
作者信息 作者:彭东林 邮箱:pengdonglin137@163.com 1.反编译设备树 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助.这里我们 ...
- 设备树(device tree)学习笔记【转】
转自:https://www.cnblogs.com/pengdonglin137/p/4495056.html 阅读目录(Content) 1.反编译设备树 2.分析工具fdtdump 3.Linu ...
- 「Link-Cut Tree」学习笔记
Link-Cut Tree,用来解决动态树问题. 宏观上,LCT维护的是森林而非树.因此存在多颗LCT.有点像动态的树剖(链的确定通过$Access$操作),每条链用一颗$splay$维护.$spla ...
- Note -「Dsu On Tree」学习笔记
前置芝士 树连剖分及其思想,以及优化时间复杂度的原理. 讲个笑话这个东西其实和 Dsu(并查集)没什么关系. 算法本身 Dsu On Tree,一下简称 DOT,常用于解决子树间的信息合并问题. 其实 ...
- [学习笔记]Dsu On Tree
[dsu on tree][学习笔记] - Candy? - 博客园 题单: 也称:树上启发式合并 可以解决绝大部分不带修改的离线询问的子树查询问题 流程: 1.重链剖分找重儿子 2.sol:全局用桶 ...
- Matrix_tree Theorem 矩阵树定理学习笔记
Matrix_tree Theorem: 给定一个无向图, 定义矩阵A A[i][j] = - (<i, j>之间的边数) A[i][i] = 点i的度数 其生成树的个数等于 A的任意n ...
随机推荐
- Boost Started on Unix Variants
- vue3.x全局插件和组件
做vue项目的时候,总有一些小组件或者工具类,我们需要频繁的使用,每个使用的地方再去引用相对比较麻烦,当然也有一些好处,尤其是配合组件异步加载的时候,能最更好的减少项目首次加载的体积,从而优化一些体验 ...
- 基于Apache Zookeeper手写实现动态配置中心(纯代码实践)
相信大家都知道,每个项目中会有一些配置信息放在一个独立的properties文件中,比如application.properties.这个文件中会放一些常量的配置,比如数据库连接信息.线程池大小.限流 ...
- 联想SR658安装显卡驱动【NVIDIA Tesla V100】
1. 安装基础依赖环境 yum -y install gcc kernel-devel kernel-headers 2.查看内核和源码版本是否一致 查看内核版本: ls /boot | grep v ...
- airtest keyevent 按键速查表
- DDD领域驱动设计-概述-Ⅰ
如果我看得更远,那是因为我站在巨人的肩膀上.(If I have seen further it is by standing on ye shoulder of Giants.) ...
- CCD摄像头视场角计算公式
视场角大小和CCD传感器尺寸和镜头焦距有关: 水平视场角 = 2 × arctan(w / 2f); 垂直视场角 = 2 × arctan(h / 2f); 视场角 = 2 × arctan(d / ...
- hdu 1083 Courses(二分图最大匹配)
题意: P门课,N个学生. (1<=P<=100 1<=N<=300) 每门课有若干个学生可以成为这门课的代表(即候选人). 又规定每个学生最多只能成为一门课的代 ...
- 云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践
Fluid 是云原生基金会 CNCF 下的云原生数据编排和加速项目,由南京大学.阿里云及 Alluxio 社区联合发起并开源.本文主要介绍云知声 Atlas 超算平台基于 Fluid + Alluxi ...
- cpu内核态与用户态
1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...