博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元
阅读量:5891 次
发布时间:2019-06-19

本文共 1818 字,大约阅读时间需要 6 分钟。

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

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

值得注意的点:

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

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

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

#include 
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;}

转载于:https://www.cnblogs.com/maomao9173/p/10944375.html

你可能感兴趣的文章
JavaScript---事件
查看>>
Android NDK入门实例 计算斐波那契数列一生成jni头文件
查看>>
c/c++性能优化--I/O优化(上)
查看>>
将HTML特殊转义为实体字符的两种实现方式
查看>>
jquery 保留两个小数的方法
查看>>
网站架构设计的误区
查看>>
iis 故障导致网站无法访问
查看>>
C++ 基础笔记(一)
查看>>
System.Func<>与System.Action<>
查看>>
asp.net开源CMS推荐
查看>>
csharp skype send message in winform
查看>>
MMORPG 游戏服务器端设计--转载
查看>>
《星辰傀儡线》人物续:“灭世者”、“疯狂者”、“叛逆者”三兄妹
查看>>
安装系统字体
查看>>
SILK 的 Tilt的意思
查看>>
Html学习笔记3
查看>>
批处理学习笔记8 - 深入学习For命令1
查看>>
微信支付开发(11) Native支付
查看>>
HDFS dfsclient写文件过程 源码分析
查看>>
关于多线程的那些事
查看>>