行列式:

参考

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. java继承当中都有一些什么样的构造函数规则?

    6.继承当中的构造函数规则   马克-to-win:继承当中的构造函数规则貌似复杂: 记住我给你的以下几条口诀, 你高枕无忧.1)如果你在某类中写了带参构造函数,系统就不会再为你在那类中自动添加无参构 ...

  2. C2678 二进制“<”: 没有找到接受“const ***”类型的左操作数的运算符解决办法

    正确代码如下:#include<iostream> #include<string> #include<map> using namespace std; /*仿函 ...

  3. 实际业务处理 Kafka 消息丢失、重复消费和顺序消费的问题

    关于 Kafka 消息丢失.重复消费和顺序消费的问题 消息丢失,消息重复消费,消息顺序消费等问题是我们使用 MQ 时不得不考虑的一个问题,下面我结合实际的业务来和你分享一下解决方案. 消息丢失问题 比 ...

  4. 时间盲注——AS别名让盲注不盲

    用处 页面存在时间盲注,注入成功了,你啥也看不到. 这只是为了能够查看到注入后的结果 网站部分源代码 <?php $conn = mysqli_("127.0.0.1",&q ...

  5. MySQL 中继日志

    什么是中继日志从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件即relay-log日志中,然后从服务器SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器 ...

  6. SpringCloudAlibaba入门之Sentinel(SCA)

    微服务保护和熔断降级技术Sentinel 1.微服务调用存在问题 由于一个服务不可用,有可能会导致一连串的微服务跟着不可用[服务器支持的线程和并发数有限,请求一直阻塞,会导 致服务器资源耗尽,从而导致 ...

  7. &&与&,||与| 区别

    1. &&和&都是表示与,区别是&&只要第一个条件不满足,后面条件就不再判断. 而&要对所有的条件都进行判断. public class Test { ...

  8. Win下GCC报错 error: ‘for’ loop initial declarations are only allowed in C99 mode

    ##报错## 用GCC编译for循环会出现以下错误 error: 'for' loop initial declarations are only allowed in C99 mode 如图所示: ...

  9. Ansible Notes: Tower Credential的本质

    Ansible AWX/Tower credential 的本质 Ansible Tower (社区版本叫AWX)用credential这个资源来对象来存储playbook运行过程中用到的机密信息.比 ...

  10. SpringBoot--Easycode、mybatisX插件生成entity,controller,service,dao,mapper IDEA版 项目提效神器

    一.介绍 Easycode是idea的一个插件,可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码,简单而强大. MybatisX 是一款基于 ...