luoguP3317 [SDOI2014]重建 变元矩阵树定理 + 概率

首先,我们需要求的是

$$\sum\limits_{Tree} \prod\limits_{E \in Tree} E(u, v) \prod\limits_{E \notin Tree} (1 - E(u, v))$$

我们知道变元矩阵树定理 ---> 不知道请见此

我们自然希望要求和的事物只跟生成树的边有关

因此考虑把$\prod\limits_{E \notin Tree} (1 - E(u, v))$转化为$\prod\limits_{E} (1 - E(u, v)) * \frac{1}{\prod\limits_{E \in Tree} (1 - E(u, v))}$

也就是说,我们定义$e(u, v) = \frac{p(u, v)}{1 - p(u, v)}$

然后就是变元矩阵树定理的裸题了......

复杂度$O(n^3)$

#include <cstdio>
#include <iostream>
using namespace std;

#define sid 55
#define ri register int
#define le long double
#define eps 1e-9

int n;
le all = 1, g[sid][sid], p[sid][sid];

le abs(le a) { return (a > 0) ? a : -a; }

le Guass() {
    for(ri i = 1; i < n; i ++) {
        int p = i;
        for(ri j = i; j < n; j ++)
        if(abs(g[j][i]) - abs(g[p][i]) > eps) p = j;
        swap(g[i], g[p]);
        for(ri j = i + 1; j < n; j ++) {
            le t = g[j][i] / g[i][i];
            for(ri k = i; k < n; k ++)
            g[j][k] -= g[i][k] * t;
        }
    }
    le ret = 1;
    for(ri i = 1; i < n; i ++) ret *= g[i][i];
    return ret;
}

int main() {
    cin >> n;
    for(ri i = 1; i <= n; i ++)
    for(ri j = 1; j <= n; j ++)
    cin >> p[i][j];
    for(ri i = 1; i <= n; i ++)
    for(ri j = 1; j <= n; j ++) {
        if(i == j) continue;
        if(p[i][j] > 1 - eps) p[i][j] = p[i][j] - eps;
        if(i < j) all *= (1 - p[i][j]);
        g[i][j] = p[i][j] / (1 - p[i][j]);
    }
    for(ri i = 1; i <= n; i ++)
    for(ri j = 1; j <= n; j ++)
    if(i != j) {
        g[i][i] += g[i][j];
        g[i][j] = -g[i][j];
    }
    printf("%.8Lf\n", Guass() * all);
    return 0;
}

原文地址:https://www.cnblogs.com/reverymoon/p/9512926.html

时间: 2024-11-01 00:29:16

luoguP3317 [SDOI2014]重建 变元矩阵树定理 + 概率的相关文章

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

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

【Luogu】P3317重建(高斯消元+矩阵树定理)

题目链接 因为这个专门跑去学了矩阵树定理和高斯消元qwq 不过不是很懂.所以这里只放题解 玫葵之蝶的题解 某未知dalao的矩阵树定理 代码 #include<cstdio> #include<cstdlib> #include<cctype> #include<algorithm> #include<cstring> #include<cmath> #define eps 1e-8 #define maxn 100 using na

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

最近集中学习了一下矩阵树定理,自己其实还是没有太明白原理(证明)类的东西,但想在这里总结一下应用中的一些细节,矩阵树定理的一些引申等等. 首先,矩阵树定理用于求解一个图上的生成树个数.实现方式是:\(A\)为邻接矩阵,\(D\)为度数矩阵,则基尔霍夫(Kirchhoff)矩阵即为:\(K = D - A\).具体实现中,记 \(a\) 为Kirchhoff矩阵,则若存在 \(E(u, v)\) ,则\(a[u][u] ++, a[v][v] ++, a[u][v] --, a[v][u] --\

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

In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of cities that can be c

@算法 - [email&#160;protected] matrix - tree 定理(矩阵树定理)

目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 定理主体@ @证明 part - [email protected] @证明 part - [email protected] @证明 part - [email protected] @证明 part - 4@ @2 - 一些简单的推广@ @3 - 例题与应用@ @0 - 参考资料@ MoebiusMeow 的讲解(超喜欢这个博主的!) 网上找的另外一篇讲解 @0.5 - 你所需要了解的线性代数知识@ 什么是矩阵

【bzoj4894】天赋 矩阵树定理

题目描述 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在学习了另一个天赋的条件下才能学习的.比如,要想学会"开炮",必须先学会"开枪".一项天赋可能有多个前置天赋,但只需习得其中一个就可以学习这一项天赋.上帝不想为难小明,于是小明天生就已经习得了1号天赋-----"打架".于是小明想知道学习完这n种天赋的方案数,答案对1

再探矩阵树定理

坚定不移的向前奔跑 才是我应该做的事情吧. 多思考一下 你会发现不一样的世界. 所谓矩阵树定理 用于一张无向图之上求出该图的所有生成树的个数. 在探究其之前我们先再次回顾一番 矩阵的基本定义 和一些比较基本的操作. 矩阵 有行有列 不过有两个定义 行向量 和 列向量 分别指某一行或某一列所形成的向量.(高维空间 线性空间 对于一个向量 w 如果w可以表示为 \(w=\sum_{v_i\in S}a_iv_i\) 那么我们认为w是可以被S中的向量线性组合出来的. 线性无关:如果一个向量空间中的每个

【BZOJ4031】[HEOI2015]小Z的房间 矩阵树定理

[BZOJ4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙).同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路.现在,你希望统计一共有多少种可行的方案.

走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞

n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未确定的格子<=300. ...一脸懵逼地写了原本30实际20的暴力然后跪着啃了下论文 然而什么都没啃懂不如结论记下来: 首先矩阵行列式的定义:一个n*n的矩阵,行列式值为$\sum_{b是n的一个排列} \ \ \ \ \ ( (-1)^{b的逆序对数} \ \ \ \ \ * \prod_{i=1}^