【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元
题解看这里,主要想说一下以前没见过的变元矩阵树还有前几个题见到的几个小细节。
邻接矩阵是可以带权值的。求所有生成树边权和的时候我们有一个基尔霍夫矩阵,是度数矩阵减去邻接矩阵。而所谓变元矩阵树实际上就是把度数矩阵和邻接矩阵带权化,也就是度数矩阵变成该点连接的所有边的权值和,邻接矩阵变成边权矩阵,剩下的依然是求一个行列式。变元矩阵树求的是所有可能生成树的边权之积。
值得注意的点:
交换两行,行列式取反。在\(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]重建 变元矩阵树,高斯消元的更多相关文章
- BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元
BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...
- 【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基
题目描述 输入 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图 ...
- 【bzoj4184】shallot 线段树+高斯消元动态维护线性基
题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...
- P3317 [SDOI2014]重建 变元矩阵树定理 高斯消元
传送门:https://www.luogu.org/problemnew/show/P3317 这道题的推导公式还是比较好理解的,但是由于这个矩阵是小数的,要注意高斯消元方法的使用: #include ...
- BZOJ 4031 HEOI2015 小Z的房间 基尔霍夫矩阵+行列式+高斯消元 (附带行列式小结)
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可 ...
- bzoj 1444 AC自动机 + 矩阵乘法 | 高斯消元
恶补了一下AC自动机,花了一天时间终于全部搞明白了. 思路:将每个人的串加入AC自动机,在AC自动机生成的状态图上建边,注意单词末尾的节点只能转移到自己概率为1, 然后将矩阵自乘几十次后误差就很小了, ...
- bzoj 3503: [Cqoi2014]和谐矩阵【高斯消元】
如果确定了第一行,那么可以推出来整个矩阵,矩阵合法的条件是n+1行全是0 所以推出来n+1行和1行的关系,然后用异或高斯消元来解即可 #include<iostream> #include ...
- Broken robot CodeForces - 24D (三对角矩阵简化高斯消元+概率dp)
题意: 有一个N行M列的矩阵,机器人最初位于第i行和第j列.然后,机器人可以在每一步都转到另一个单元.目的是转到最底部(第N个)行.机器人可以停留在当前单元格处,向左移动,向右移动或移动到当前位置下方 ...
- hihocoder 第五十二周 高斯消元·二【高斯消元解异或方程 难点【模板】】
题目地址:http://hihocoder.com/contest/hiho57/problem/1 输入 第1..5行:1个长度为6的字符串,表示该行的格子状态,1表示该格子是亮着的,0表示该格子是 ...
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...
随机推荐
- 【AMAD】import-string -- 通过字符串来import一个对象
动机 简介 用法 个人评分 动机 一些情况下,你不能直接使用from ... import ...来引用对象. 比如在循环引用的情况下. 比如在一些settings文件配置中. 这时候需要另一种办法. ...
- dll的封装和使用
背景 在windows平台下,要实现函数的封装,一般采用的是dll动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成dll动态库 在VS中生成新项目,应 ...
- MVC、MVP、MVVM模式的概念与区别
1. MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示 ...
- sql server如何精准匹配字符中的字符,绝对匹配
举例: 我现在是需要查询这字段里包含1的数据 我如果直接charindex,那么11,12也会被包含. 解决(1): select * from ( select '1,2,12,111' as s ...
- [转帖]一张图让你看懂InnoDB
一张图让你看懂InnoDB 2018年05月10日 10:02:34 灵魂自由的忙人 阅读数 299 https://blog.csdn.net/xiaoyi23000/article/details ...
- jdbc简单使用
1.代码 import java.sql.*; public class DBUtil { public static void main(String[] args) throws ClassNot ...
- php aes加解密,mcrypt_encrypt 和openssl_encrypt
php7.1以下版本使用 /* * mcrypt_encrypt 加密 * php7.1开始被丢弃 可以使用openssl_encrypt * */ function aes_encrypt($con ...
- mongodb 添加用户
use admindb.createUser({ user:"admin", pwd:"abc123456", roles:[{role:"root& ...
- 通过Playbook部署LAMP
Ansible的PlayBook文件格式为YAML语言,所以希望你在编写PlayBook前对YAML语法有一定的了解,否则在运行PlayBook的时候经常碰到语法错误提示,这里我们通过介绍批量部署LA ...
- redis 学习(12)-- redis 发布订阅
redis 发布订阅 发布订阅模式中的角色 发布者(publisher) 订阅者(subscriber) 频道(channel) 如图所示: 发布者发布消息到频道,订阅了频道的订阅者可以收到消息,订阅 ...