首页 > 其他分享 >重建 题解

重建 题解

时间:2023-07-27 19:45:06浏览次数:42  
标签:include int 题解 sum double prod Bigg 重建

重建

题目大意

给定一张无向图,第 \(i\) 条边存在的概率为 \(p_i\),求这个无向图是一颗树的概率。

思路分析

所求即为:

\[\sum_{T}\Bigg(\prod_{e\in T}p_e\Bigg)\Bigg(\prod_{e\not \in T}(1-p_e)\Bigg) \]

其中,\(T\) 是一个边集,当 \(T\) 中的边均存在时且其他边均不存在时,原图构成一颗树。

解释一下:枚举每一颗树,对每一颗树出现的概率求和,而一颗树出现当且仅当所有属于树的边均出现且所有不属于树的边均不出现。

发现这个东西长的很像矩阵树定理的形式,对比一下,矩阵树定理求的是

\[\sum_{T}\prod_{e\in T}w_e \]

也就是图的所有生成树的边权之积的和。

考虑转化一下:

\[\begin{aligned}\sum_{T}\Bigg(\prod_{e\in T}p_e\Bigg)\Bigg(\prod_{e\not \in T}(1-p_e)\Bigg)&=\sum_{T}\Bigg(\prod_{e\in T}p_e\Bigg)\Bigg(\frac{\prod (1-p_e)}{\prod_{e\in T}(1-p_e)}\Bigg)\\&=\Bigg(\prod (1-p_e)\Bigg)\sum_{T}\Bigg(\prod_{e\in T}\frac{p_e}{1-p_e}\Bigg)\end{aligned} \]

故只需要对于每条边,将边权设为 \(\frac{p_i}{1-p_i}\),再用矩阵树定理跑一遍,最后乘上前面的那个积就可以了。

注意,可能存在 \(p_i=1\) 的情况,这时可以将边权微调,比如设为 \(1-\text{eps}\),这样对结果的影响在可接受精度之内。

代码

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>

using namespace std;
const int N=55;
#define eps 1e-8

int n;

double a[N][N],w[N][N],prod=1;

double solve(){
    double ans=1,f=1;
    for(int i=2;i<=n;i++)
        for(int j=i+1;j<=n;j++){
            while(a[i][i]>eps){
                double div=a[j][i]/a[i][i];
                for(int k=2;k<=n;k++)
                    a[j][k]-=div*a[i][k];
                swap(a[i],a[j]);f=-f;
            }
            swap(a[i],a[j]);f=-f;
        }
    for(int i=2;i<=n;i++) ans=ans*a[i][i];
    return ans;
}

void add(int u,int v,double w){
    a[u][u]+=w;a[v][v]+=w;
    a[u][v]-=w;a[v][u]-=w;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            scanf("%lf",&w[i][j]);
            if(i<=j) continue;
            if(w[i][j]>1-eps) w[i][j]=1-eps;//微调
            prod*=1-w[i][j];
            w[i][j]=w[i][j]/(1-w[i][j]);
            add(i,j,w[i][j]);
        }
    printf("%.5lf\n",prod*solve());
    return 0;
}

标签:include,int,题解,sum,double,prod,Bigg,重建
From: https://www.cnblogs.com/TKXZ133/p/17585856.html

相关文章

  • AT_abc182_d 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述从数轴的原点开始向正方向走。第一次向前走\(a_1\)步,第二次向前走\(a_1+a_2\),以此类推。求走过的最大位置。思路首先直接模拟时间复杂度\(O(n^2)\),看一下数据范围\((1\leN......
  • Lucky Array 题解
    LuckyArray题目大意维护一个序列,支持以下操作:区间加一个大于\(0\)的数。区间查询有多少个数位上只包含\(4\)或\(7\)的数。思路分析看起来很不可做,但考虑到题目给了一个特殊性质:保证所有数操作前后都不超过\(10^4\)。那么如果暴力进行区间加,最坏情况会加\(1......
  • P9017 [USACO23JAN] Lights Off G 题解
    Description给定正整数\(N\),和两个长为\(N\)的\(01\)序列\(a\)和\(b\)。定义一次操作为:将\(b\)序列中的一个值翻转(即\(0\)变成\(1\),\(1\)变成\(0\),下同)。对于\(b\)序列中每个值为\(1\)的位置,将\(a\)序列中对应位置的值翻转。将\(b\)序列向右循环移位......
  • CF938G Shortest Path Queries 题解
    目录题目链接题目分析为什么使用生成树建树对于异或贡献的分析code题目链接CF938G洛谷挂了只能交CF题目分析本题有以下几个关键点:为什么使用生成树建树首先根据\(WC2011\)我们发现可以使用\(dfs\)序来保存节点之间的关系但是我们发现本题目中存在加边删边操作不......
  • UVA10702 Travelling Salesman 题解
     UVA10702TravellingSalesman题解题面:有个旅行的商人,他每到一个的新城市,便卖掉所有东西再购买新东西,从而获得利润。从某城市A到某城市B有固定利润(B 到A 的利润可能不同)。已知城市可以重复到达,从S 点出发,经过T 个城市,有E个城市能作为终点,求最大的利润。先定义......
  • CF1053E-Euler Tour题解
    前言还是一道神仙题很难想题面luogu上copy的样例解释懒得翻,我觉得应该都看得懂样例吧。题面翻译现有一棵\(n\)个点的形态未知的树,给定其长度为\(2n-1\)的欧拉序的一部分请根据给出的残缺的欧拉序还原出一个完整的欧拉序或判断不存在这样的树输入中用非零数字表示欧拉......
  • P3704 [SDOI2017] 数字表格 题解
    一、题目描述:用$f_i$表示斐波那契数列的第$i$项,那么有:$f_0=0,f_1=1;f_n=f_{n-1}+f_{n-2},n\ge2$现在有一个$n$行$m$列的数字表格,第$i$行第$j$列的数字是$f_{\gcd(i,j)}$。求这个表格所有数的乘积。共有$T$组数据,答案对$10^9+7$取模。......
  • Xcode12 开发12.5.7版本IOS的问题解决
    1.xcode12默认是创建的工程是14.2,所以需要修改一下工程版本。点击项目最上面的蓝色文件就可以打开下面的界面了。2.安装app之后,界面黑屏。解决方法如下:在AppDelegate.h中:#import<UIKit/UIKit.h>@interfaceAppDelegate:UIResponder<UIApplicationDelegate>//增......
  • [ARC143B] Counting Grids 题解
    CountingGrids题目大意将\(1\simn^2\)填入\(n\timesn\)的网格\(A\)中,对于每个格子满足以下条件之一:该列中存在大于它的数。该行中存在小于它的数。求方案数。思路分析首先有一个比较显然的结论:对于一个不合法的方案,有且仅有一个数不满足任何一个条件。考虑......
  • [ABC308G] Minimum Xor Pair Query 题解
    MinimumXorPairQuery题目大意维护一个序列,支持动态插入,删除,查询最小异或对。思路分析看到查询最小异或对首先想到01Trie,但01Trie不支持删除,考虑暴力套一个线段树分治。需要预处理出每个元素的存活区间,这里使用了map<int,vector<int>>。注意,有的元素会存活到最后,需要特......