「SDOI2014」重建

题意

给一个图\(G\),两点\((u,v)\)有边的概率是\(p_{u,v}\),求有\(n-1\)条边通行且组成了一颗树的概率是多少。


抄了几个矩阵树定理有趣的感性说法

  • 矩阵树定理的度数矩阵记录的是每个点的边权和,邻接矩阵记录的是边权,求的则是所有生成树的边权乘积和

  • 考虑Kirchhoff矩阵的意义:\(K[G]=D[G]−A[G]=B[G]B^T[G]\),之所以能够进行生成树计数是对于其伴随矩阵在计数\(n−1\)条边的集合时,当\(n−1\)条边中存在环就会产生线性组合而导致行列式为零,否则恰好对角线上均为伴随矩阵中所赋的值,使得\(\det(B_{i,j})^2\)就为\(1\)

考虑直接把度数矩阵赋为出度概率和,连边矩阵为概率,然后相减套矩阵树定理求得是什么

\[\sum_T\prod_{(u,v)\in T}p_{u,v}
\]

然而我们需要求

\[\sum_T\prod_{(u,v)\in T}p_{u,v}\prod_{(u,v)\notin T}(1-p_{u,v})
\]

化一下可以得到

\[\prod_{(u,v)\in G}(1-p_{u,v})\sum_T\prod_{(u,v)\in T}\frac{p_{u,v}}{1-p_{u,v}}
\]

然后把后面的拿去跑矩阵树就可以了。

注意一些精度问题,把\(p=0\)搞成\(p=\epsilon\),\(p=1\)搞成\(1-\epsilon\)差不多就可以了


Code:

#include <cstdio>
#include <cmath>
#include <algorithm>
const int N=52;
const double eps=1e-10;
int n;
double p[N][N],a[N][N];
void Gauss()
{
--n;
for(int i=1;i<=n;i++)
{
int id=i;
for(int j=i+1;j<=n;j++)
if(fabs(a[id][i])<fabs(a[j][i])) id=j;
std::swap(a[id],a[i]);
for(int j=i+1;j<=n;j++)
{
double p=a[j][i]/a[i][i];
for(int k=n;k>=i;k--)
a[j][k]-=a[i][k]*p;
}
}
}
int main()
{
scanf("%d",&n);
double sum=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%lf",&p[i][j]);
if(p[i][j]==0) p[i][j]=eps;
if(p[i][j]==1) p[i][j]=1-eps;
if(i<j) sum*=1-p[i][j];
a[i][j]=p[i][j]/(1-p[i][j]);
}
for(int i=1;i<=n;i++)
{
a[i][i]=0;
for(int j=1;j<=n;j++)
if(i!=j)
a[i][i]+=a[i][j],a[i][j]=-a[i][j];
}
Gauss();
for(int i=1;i<=n;i++) sum*=fabs(a[i][i]);
printf("%.4lf\n",sum);
return 0;
}

2019.2.21

「SDOI2014」重建 解题报告的更多相关文章

  1. 「SDOI2014」Lis 解题报告

    「SDOI2014」Lis 题目描述 给定序列 \(A\),序列中的每一项 \(A_i\) 有删除代价 \(B_i\) 和附加属性 \(C_i\). 请删除若干项,使得 \(A\) 的最长上升子序列长 ...

  2. 「ZJOI2016」旅行者 解题报告

    「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...

  3. 「HNOI2016」树 解题报告

    「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...

  4. 「HNOI2016」序列 解题报告

    「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...

  5. 「HNOI2016」网络 解题报告

    「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...

  6. 「HAOI2018」染色 解题报告

    「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...

  7. 「HNOI2016」最小公倍数 解题报告

    「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...

  8. 「SCOI2016」围棋 解题报告

    「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...

  9. 「SCOI2016」妖怪 解题报告

    「SCOI2016」妖怪 玄妙...盲猜一个结论,然后过了,事后一证,然后假了,数据真水 首先要最小化 \[ \max_{i=1}^n (1+k)x_i+(1+\frac{1}{k})y_i \] \ ...

随机推荐

  1. 软工网络15团队作业8——Beta阶段敏捷冲刺

    Deadline: 2018-5-31 22:00PM,以博客提交至班级博客时间为准 根据以下要求: (1)在敏捷冲刺前发布一篇博客,作为beta版敏捷冲刺的开始, (2)同时,团队在日期区间[5.2 ...

  2. 【转】安装ambari的时候遇到的ambari和hadoop问题集

    5.在安装的时候遇到的问题 5.1使用ambari-server start的时候出现ERROR: Exiting with exit code -1. 5.1.1REASON: Ambari Ser ...

  3. 常见的 CSRF、XSS、sql注入、DDOS流量攻击

    CSRF攻击 :跨站请求伪造攻击 ,CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性 攻击者一般会使用吸引人的图片去引导用户点击进 ...

  4. 字符串和ASCII之间的转换

    public class CharToAscii { public static void main(String[] args) { CharToAscii.AscToString(); CharT ...

  5. Select2 4.0.5 API

    详细属性参考官方API,https://github.com/select2/select2/releases/tag/4.0.5 注:4.0.5版本API与3.x版本有差异,有些属性已废弃,以下列出 ...

  6. Docker入门了解一下(第一篇)

    最近在学docker.k8s什么的,看得脑子有点乱.从来没弄过在linux上搭建一个分布式的环境,所以对这些不太了解,还是从最简单的地方剖析吧. Docker学习传送:http://www.ityou ...

  7. tomcat优化实例

    ———————————————————————————————————— 一.运行模式优化 修改tomcat运行模式为nio<Connector port="80" prot ...

  8. Google css & Google fonts

    最近用某开源模板做提案的时候, 抓包工具老是有外部Request. 问题出在某css中有这么一句: @import url(https://fonts.googleapis.com/css?famil ...

  9. webpack模塊打包機

    https://blog.csdn.net/qq_38277366/article/details/82907894

  10. if 结构语句

    if 条件: print()#不只是能输入print