行列式:

参考

oi-wiki

定义

对于一个\(n*n\)的矩阵A行列式取值(标量)

\(det(A)=|A|=\sum\limits_p(-1)^{\tau(p)}\prod\limits_{i=1}^na_{i,p_i}\)

\(\tau(p)\)即排列\(p\)的逆序对个数。

性质

证明后面再补

1.\(|A|=|A^T|\),即排列是按排列p下表为行的行列式等同于排列p下标为列的得到的行列式。

2.交换两行(列),行列式取相反数

3.把一个矩阵的一行(列)的值全部乘一个常数加到另一行(列)上,行列式值不变。

求解

看看性质3,是不是很像高斯消元。

然后高斯消元后面得到的是一个倒三角矩阵。(除了这个斜下对角线排列,其它排列都含零)

画画图可以发现,最后答案是\(\prod\limits_{i=1}^na_{i,i}\)。中途注意维护一下交换两行带来的正负的变化。

ps.下面这道题消元用的是辗转相减(除),因为p不一定是质数,不一定能求逆元。

code【模板】行列式求值:

#include<bits/stdc++.h>
using namespace std;
const int N=605;
int n,p,a[N][N];
void Gauss() {
int opt=1;
for(int i=1;i<=n;i++) {
for(int j=i+1;j<=n;j++) {
while(a[i][i]) {
int d=a[j][i]/a[i][i];
for(int k=1;k<=n;k++) {a[j][k]-=1ll*a[i][k]*d%p;a[j][k]%=p;}
opt=-opt;swap(a[i],a[j]);
}
opt=-opt;swap(a[i],a[j]);
}
}
int ans=opt;
for(int i=1;i<=n;i++)ans=1ll*ans*a[i][i]%p;
printf("%d",(ans+p)%p);
}
int main() {
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {scanf("%d",&a[i][j]);}
Gauss();
return 0;
}

矩阵树定理

求解的是一个图中的所有生成树边权积的和

  • 无向图

    定义Laplace矩阵L为:

    \(L(G)=D(G)-A(G)\)

    其中\(D(G)\)为度数矩阵。每个\(D_{i,i}=deg[i]\)其余行列不等的值为\(0\)。\(A(G)\)为邻接矩阵。

    \(|L(G)|\)即为答案。

    ps.自环不计入
  • 有向图

    出树(从根往外连):\(D\)为\(in[]\)入度

    入树(从外往根连):\(D\)为\(out[]\)出度

    特别的:生成树的个数\(t(G)\)即把边权赋为1,这样每个生成树的权值就是1。
  • code【模板】Matrix-Tree 定理:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=305;
const int mod=1e9+7;
ll a[N][N],mul,opt=1;
int n,m,t;
ll ksm(ll a,ll b) {ll res=1;for(;b;b>>=1,a=a*a%mod)if(b&1)res=res*a%mod;return res;}
void Gauss() {
opt=1;
for(int i=2;i<n;i++) {
int r=i;
while(r<=n&&!a[r][i]) r++;
if(r>n) {continue;}
if(r!=i) {swap(a[r],a[i]);opt=-opt;}
for(int j=i+1;j<=n;j++) {
ll d=a[j][i]*ksm(a[i][i],mod-2)%mod;
for(int k=2;k<=n;k++) a[j][k]-=a[i][k]*d,a[j][k]%=mod;
}
}
mul=opt;
for(int i=2;i<=n;i++)mul=mul*a[i][i]%mod;
mul=(mul+mod)%mod;
printf("%lld\n",mul);
}
int main() {
// freopen("data.in","r",stdin);
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=m;i++) {
int u,v,w;scanf("%d%d%d",&u,&v,&w);
a[u][v]=(a[u][v]-w)%mod;a[v][v]=(a[v][v]+w)%mod;
if(!t) {a[v][u]=(a[v][u]-w)%mod;a[u][u]=(a[u][u]+w)%mod;}
}
Gauss();
return 0;
}

BEST 定理

设\(G\)是有向欧拉图,求欧拉回路个数

\(ec(G)=t_{out(G)}*\prod\limits_{v \in V}(deg[v]-1)!\)

ps.欧拉图即含欧拉回路的图,满足\(in[v]=out[v]\),而且选哪个根都一样。

行列式&矩阵树定理的更多相关文章

  1. 矩阵树定理&BEST定理学习笔记

    终于学到这个了,本来准备省选前学来着的? 前置知识:矩阵行列式 矩阵树定理 矩阵树定理说的大概就是这样一件事:对于一张无向图 \(G\),我们记 \(D\) 为其度数矩阵,满足 \(D_{i,i}=\ ...

  2. LOJ #6044 -「雅礼集训 2017 Day8」共(矩阵树定理+手推行列式)

    题面传送门 一道代码让你觉得它是道给初学者做的题,然鹅我竟没想到? 首先考虑做一步转化,我们考虑将整棵树按深度奇偶性转化为一张二分图,即将深度为奇数的点视作二分图的左部,深度为偶数的点视作二分图的右部 ...

  3. [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)

    In some countries building highways takes a lot of time... Maybe that's because there are many possi ...

  4. BZOJ 2467: [中山市选2010]生成树(矩阵树定理+取模高斯消元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2467 题意: 思路:要用矩阵树定理不难,但是这里的话需要取模,所以是需要计算逆元的,但是用辗转相减会 ...

  5. 2018.09.16 spoj104Highways (矩阵树定理)

    传送门 第一次写矩阵树定理. 就是度数矩阵减去邻接矩阵之后得到的基尔霍夫矩阵的余子式的行列式值. 这个可以用高斯消元O(n3)" role="presentation" ...

  6. 【算法】Matrix - Tree 矩阵树定理 & 题目总结

    最近集中学习了一下矩阵树定理,自己其实还是没有太明白原理(证明)类的东西,但想在这里总结一下应用中的一些细节,矩阵树定理的一些引申等等. 首先,矩阵树定理用于求解一个图上的生成树个数.实现方式是:\( ...

  7. 【Learning】矩阵树定理 Matrix-Tree

    矩阵树定理 Matrix Tree ​ 矩阵树定理主要用于图的生成树计数. 看到给出图求生成树的这类问题就大概要往这方面想了. 算法会根据图构造出一个特殊的基尔霍夫矩阵\(A\),接着根据矩阵树定理, ...

  8. CF917D. Stranger Trees & TopCoder13369. TreeDistance(变元矩阵树定理+高斯消元)

    题目链接 CF917D:https://codeforces.com/problemset/problem/917/D TopCoder13369:https://community.topcoder ...

  9. BZOJ 1002 轮状病毒 矩阵树定理

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1002 题目大意: 给定n(N<=100),编程计算有多少个不同的n轮状病毒 思路 ...

随机推荐

  1. 摩拜单车微信小程序开发技术总结

    前言 摩拜单车小程序已于微信小程序上线第一天正式发布,刷爆微博媒体朋友圈.本文主要讲讲技术方向的总结,在段时间的开发周期内内如何一步步从学习到进阶. 思维转变 微信小程序没有HTML的常用标签,而是类 ...

  2. HTML5存储方式

    由于之前在参加面试或者笔试的过程中经常会被问到HTML5存储的内容,包括它们之间的区别.特征和应用范围,所以看到一篇介绍不错的文章,把里面的个人觉得适合我的内容按照自己的理解总结如下.方便以后忘记了进 ...

  3. js和原生应用常用的数据交互方式

    场景1 在原生app中经常会使用到H5页面,比如说电商中的活动页,一些电商中的详情页,等等...这些页面都有一个特点,那就是在未来修改的可能性,和一次性的几率特别的大.所以用H5的页面是最睿智的一种选 ...

  4. Android 动态控制OptionMenu的显示与隐藏

    在有些场景下,可能需要动态的显示和隐藏optionmenu,可以这样实现:如果在activity中默认实现了方法: onCreateOptionsMenu(Menu menu) 那么该OptionMe ...

  5. Photoshop之用“色彩范围”命令抠像

    1. 打开一个文件.执行"选择>色彩范围",勾选"本地化颜色族",然后在任务背景上单击取样. 2. 取好样以后点击确定,图片如下所示,执行"选择 ...

  6. 小程序中webview内嵌h5页面

    小程序内嵌h5页面跳转小程序指定页面,  需要引用  JSSDK:   <script src="https://res.wx.qq.com/open/js/jweixin-1.3.2 ...

  7. 底部footer挡住上面内容的bug

    当设置底部footer的样式为: .footer{ position: fixed; height: 49px; bottom: 0; background: #fff; } 这样会挡住上面的内容,修 ...

  8. CPU乱序执行问题

    CPU为了提高执行效率,会在一条指令执行的过程中(比如去内存读数据,读数据的过程相较于CPU的执行速度慢100倍以上,cpu处于等待状态),这个时候cpu会分析接下来的指令是否正在执行的指令相关联,如 ...

  9. (十一)React Ant Design Pro + .Net5 WebApi:后端环境搭建-IdentityServer4(三)持久化

    一.前言 IdentityServer配合EFCore持久化,框架已经为我们准备了两个上下文: ConfigurationDbContext:配置数据(资源.客户端.身份等) PersistedGra ...

  10. Python paho-mqtt使用心得

    一.概述 一)基本概念 使用回调处理从MQTT代理返回的数据,要使用回调需要先定义回调函数然后将其指派给客户端实例(client). 例如: # 定义一个回调函数 def on_connect(cli ...