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

传送门:https://www.luogu.org/problemnew/show/P3317

这道题的推导公式还是比较好理解的,但是由于这个矩阵是小数的,要注意高斯消元方法的使用;

#include <algorithm>
#include  <iterator>
#include  <iostream>
#include   <cstring>
#include   <cstdlib>
#include   <iomanip>
#include    <bitset>
#include    <cctype>
#include    <cstdio>
#include    <string>
#include    <vector>
#include     <stack>
#include     <cmath>
#include     <queue>
#include      <list>
#include       <map>
#include       <set>
#include   <cassert>

/*

⊂_ヽ
  \\ Λ_Λ  来了老弟
   \(‘?‘)
    > ⌒ヽ
   /   へ\
   /  / \\
   ? ノ   ヽ_つ
  / /
  / /|
 ( (ヽ
 | |、\
 | 丿 \ ⌒)
 | |  ) /
‘ノ )  L?

*/

using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3;

//priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl ‘\n‘

#define boost ios::sync_with_stdio(false);cin.tie(0)
#define rep(a, b, c) for(int a = (b); a <= (c); ++ a)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c);

const ll oo = 1ll<<17;
const ll mos = 0x7FFFFFFF;  //2147483647
const ll nmos = 0x80000000;  //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //18
const int mod = 1e9;
const double esp = 1e-8;
const double PI=acos(-1.0);
const double PHI=0.61803399;    //黄金分割点
const double tPHI=0.38196601;

template<typename T>
inline T read(T&x){
    x=0;int f=0;char ch=getchar();
    while (ch<‘0‘||ch>‘9‘) f|=(ch==‘-‘),ch=getchar();
    while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
    return x=f?-x:x;
}

inline void cmax(int &x,int y){if(x<y)x=y;}
inline void cmax(ll &x,ll y){if(x<y)x=y;}
inline void cmin(int &x,int y){if(x>y)x=y;}
inline void cmin(ll &x,ll y){if(x>y)x=y;}

/*-----------------------showtime----------------------*/
            const int maxn = 109;
            double mp[maxn][maxn];
            double a[maxn][maxn];

            int n;

            double Gauss(int n){
                for(int i=1; i<n; i++){
                    int mx = i;
                    for(int j=i+1; j<n; j++){
                        if(fabs(a[mx][i]) < fabs(a[j][i])) mx = j;
                    }
                    swap(a[i], a[mx]);
                    for(int j=i+1; j<n; j++){
                        double tmp = a[j][i]/a[i][i];
                        for(int k=i+1; k<n; k++)
                            a[j][k] -= a[i][k] * tmp;
                    }
                }
                double ans = 1;
                for(int i=1; i<n; i++) ans *= a[i][i];
                return fabs(ans);
            }

int main(){
            scanf("%d", &n);
            double tmp = 1;
            for(int i=1; i<=n; i++) {
                for(int j=1; j<=n; j++) {
                    scanf("%lf", &mp[i][j]);
                    if(fabs(1.0 - mp[i][j]) < esp) mp[i][j] = 1.0- esp;
                    if(i < j)tmp = tmp * (1.0-mp[i][j]);
                    mp[i][j] = mp[i][j] / (1.0 - mp[i][j]);
                }
            }

            for(int i=1; i<=n; i++){
                for(int j=i+1; j<=n; j++){
                    a[i][j] = a[j][i] = -mp[i][j];
                    a[i][i] += mp[i][j];
                    a[j][j] += mp[i][j];
                }
            }
            printf("%.10f\n", Gauss(n) * tmp);
            return 0;
}

原文地址:https://www.cnblogs.com/ckxkexing/p/10503509.html

时间: 2024-10-10 21:44:46

P3317 [SDOI2014]重建 变元矩阵树定理 高斯消元的相关文章

[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

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

【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

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

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2466 [题目大意] 给定一棵树,每个节点有一盏指示灯和一个按钮.如果节点的按扭被按了, 那么该节点的灯会从熄灭变为点亮(当按之前是熄灭的),或者从点亮到熄灭 并且该节点的直接邻居也发生同样的变化.开始的时候,所有的指示灯都是熄灭的. 请编程计算最少要按多少次按钮,才能让所有节点的指示灯变为点亮状态. [题解] 高斯消元枚举自由变元回代. [代码] #include <cstdio>

【算法】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] --\

再探矩阵树定理

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

hihoCoder#1196 : 高斯消元&#183;二(开关灯问题)

传送门 高斯消元解异或方程组 小Ho在游戏板上忙碌了30分钟,任然没有办法完成,于是他只好求助于小Hi. 小Ho:小Hi,这次又该怎么办呢? 小Hi:让我们来分析一下吧. 首先对于每一个格子的状态,可能会对它造成影响的是其自身和周围4个格子,这五个格子被按下的总次数也就等于该格子所改变的总次数. 对于任意一个格子,如果这个格子改变了偶数次状态,则等价于没有发生改变. 我们可以将1看作格子亮着,0看作格子暗着,每改变1次就加1,最后格子的状态等于其总数值 MOD 2. 则其运算结果刚好满足异或运算

【CF802L】Send the Fool Further! (hard) 高斯消元

[CF802L]Send the Fool Further! (hard) 题意:给你一棵n个节点的树,每条边有长度,从1号点开始,每次随机选择一个相邻的点走,走到一个叶子时就停止,问期望走的总路程. $n\le 10^5$ 题解:很自然想到游走那题,于是想到高斯消元,但是正常高斯消元是$O(n^3)$的.不过我们有一个套路:在树上进行高斯消元的复杂度是$O(n)$的. 先列出方程:设f(x)表示从x开始期望还要走的路程,x的度数是d,那么$f(x)=\frac {f(fa)+len} d+\f

线性空间和异或空间(线性基)bzoj4004贪心+高斯消元

线性空间:是由一组基底构成的所有可以组成的向量空间 对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩 并且这i个主元线性无关 /* 每个向量有权值,求最小权极大线性无关组 本题是使用贪心策略的高斯消元 由输入给出的n个物品,每个物品有m种属性,和价格price 如果a物品的属性可以由其他已有物品的属性组合出,那么a可以不必购买 问最少花掉多少钱,使得所有物品都可以组合出 首先构建n*m矩阵,然后高斯消元 在求第i个主元时,取价格最小的那个即可 可用反证法证明 */