题解看这里,主要想说一下以前没见过的变元矩阵树还有前几个题见到的几个小细节。

邻接矩阵是可以带权值的。求所有生成树边权和的时候我们有一个基尔霍夫矩阵,是度数矩阵减去邻接矩阵。而所谓变元矩阵树实际上就是把度数矩阵和邻接矩阵带权化,也就是度数矩阵变成该点连接的所有边的权值和,邻接矩阵变成边权矩阵,剩下的依然是求一个行列式。变元矩阵树求的是所有可能生成树的边权之积。

值得注意的点:

  • 交换两行,行列式取反。在\(double\)存矩阵的时候可以最后取对角线乘积的绝对值,但如果答案要取膜就需要套上一个辗转相除来解这个矩阵,这时就要在交换行时更新答案,对答案取反处理。

  • 求行列式的时候要随便去掉一行和一列,比如去掉最后一行和最后一列就可以。可以传一个\(n-1\)进去避免写错。

  • 推式子也很重要。矩阵树定理维护的东西是可以转化为一个式子的,有时候要把它抽象出来。

#include <bits/stdc++.h>
using namespace std; const int N = 50;
const double eps = 1e-8; int n; double k = 1, p[N][N], mat[N][N]; double gauss (int n) {
double ret = 1;
for (int i = 1; i <= n; ++i) {
int besti = i;
for (int j = i; j <= n; ++j) {
if (fabs (mat[besti][i]) < fabs (mat[j][i])) {
besti = j;
}
}
if (i != besti) {
ret = -ret;
swap (mat[i], mat[besti]);
}
for (int j = i + 1; j <= n; ++j) {
if (fabs (mat[j][i]) > eps) {
double d = mat[j][i] / mat[i][i];
for (int k = i; k <= n; ++k) {
mat[j][k] -= mat[i][k] * d;
}
}
}
ret *= mat[i][i];
}
return ret;
} int main () {
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cin >> p[i][j];
if (i != j) {
p[i][j] = max (p[i][j], 0.0 + eps);
p[i][j] = min (p[i][j], 1.0 - eps);
if (i < j) k *= (1 - p[i][j]);
mat[i][j] -= p[i][j] / (1.0 - p[i][j]);
}
}
}
for (int i = 1; i <= n; ++i) {
double res = 0.0;
for (int j = 1; j <= n; ++j) if (i != j) {
res -= mat[i][j];
}
mat[i][i] = res;
}
// cout << k << endl;;
cout << k * gauss (n - 1) << endl;
}

【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元的更多相关文章

  1. BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元

    BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...

  2. 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基

    题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...

  3. 【bzoj4184】shallot 线段树+高斯消元动态维护线性基

    题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...

  4. P3317 [SDOI2014]重建 变元矩阵树定理 高斯消元

    传送门:https://www.luogu.org/problemnew/show/P3317 这道题的推导公式还是比较好理解的,但是由于这个矩阵是小数的,要注意高斯消元方法的使用: #include ...

  5. BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...

  6. bzoj 1444 AC自动机 + 矩阵乘法 | 高斯消元

    恶补了一下AC自动机,花了一天时间终于全部搞明白了. 思路:将每个人的串加入AC自动机,在AC自动机生成的状态图上建边,注意单词末尾的节点只能转移到自己概率为1, 然后将矩阵自乘几十次后误差就很小了, ...

  7. bzoj 3503: [Cqoi2014]和谐矩阵【高斯消元】

    如果确定了第一行,那么可以推出来整个矩阵,矩阵合法的条件是n+1行全是0 所以推出来n+1行和1行的关系,然后用异或高斯消元来解即可 #include<iostream> #include ...

  8. Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)

    题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...

  9. hihocoder 第五十二周 高斯消元·二【高斯消元解异或方程 难点【模板】】

    题目地址:http://hihocoder.com/contest/hiho57/problem/1 输入 第1..5行:1个长度为6的字符串,表示该行的格子状态,1表示该格子是亮着的,0表示该格子是 ...

  10. BZOJ 2466: [中山市选2009]树( 高斯消元 )

    高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...

随机推荐

  1. Python学习之格式化简述

    2.2 格式化输出 2.2.1 占位符 ​ %s就是代表字符串占位符:%d是数字占位符,%i 也可以表示数字,如果把变量后⾯的换成%d,就代表必须只能输⼊数字这时对应的数据必须是int类型. 否则程序 ...

  2. CRLF、CR、LF详解

    名词解释 CR:Carriage Return,对应ASCII中转义字符\r,表示回车 LF:Linefeed,对应ASCII中转义字符\n,表示换行 CRLF:Carriage Return &am ...

  3. Linux C/C++基础 文件(中)

    1.ubuntu cat命令的实现 cat——查看或者合并文件内容 #include<stdio.h> int main(int argc,char* argv[]) { //1.打开文件 ...

  4. springMVC异常处理总结

    a.ExceptionHandlerExceptionResolver 1.@ExceptionHandler --- 统一处理一个controller中(@ExceptionHandler所在con ...

  5. 封装自己的jquery插件

    自己尝试封装的一个在工作当中使用的多级弹窗插件: ;(function ($, window, document) { //用一个自调用匿名函数把插架代码包裹起来,防止代码污染 $.fn.multi ...

  6. Macaca环境搭建(一)----windows系统macaca安装

    一.安装JDK, 1.官方网站:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  7. PTA(Advanced Level)1065.A+B and C

    Given three integers A, B and C in [−263,263], you are supposed to tell whether A+B>C. Input Spec ...

  8. 浅谈Linux kill命令

    傻瓜常规篇: 首先,用ps查看进程,方法如下: $ ps -ef ……smx       1822     1  0 11:38 ?        00:00:49 gnome-terminalsmx ...

  9. CVE-2018-19824漏洞学习

    简介 在Linux内核4.19.6之前,本地用户可以通过在Sound / USB /card.c.的usb_audio_probe中错误处理一个恶意USB声音设备(没有接口)来利用ALSA驱动程序中的 ...

  10. java 如何编写多线程的代码

    线程是干活的所以线程一定是Thread,或者改线程实现Runnable接口多线程是竞争关系,所以多个线程竞争同一个资源,也就是同一个对象所以这个竞争对象发到Thread中即: // resources ...