「SDOI2014」重建 解题报告
「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\)
考虑直接把度数矩阵赋为出度概率和,连边矩阵为概率,然后相减套矩阵树定理求得是什么
\]
然而我们需要求
\]
化一下可以得到
\]
然后把后面的拿去跑矩阵树就可以了。
注意一些精度问题,把\(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」重建 解题报告的更多相关文章
- 「SDOI2014」Lis 解题报告
「SDOI2014」Lis 题目描述 给定序列 \(A\),序列中的每一项 \(A_i\) 有删除代价 \(B_i\) 和附加属性 \(C_i\). 请删除若干项,使得 \(A\) 的最长上升子序列长 ...
- 「ZJOI2016」旅行者 解题报告
「ZJOI2016」旅行者 对网格图进行分治. 每次从中间选一列,然后枚举每个这一列的格子作为起点跑最短路,进入子矩形时把询问划分一下,有点类似整体二分 至于复杂度么,我不会阿 Code: #incl ...
- 「HNOI2016」树 解题报告
「HNOI2016」树 事毒瘤题... 我一开始以为每次把大树的子树再接给大树,然后死活不知道咋做,心想怕不是个神仙题哦 然后看题解后才发现是把模板树的子树给大树,虽然思维上难度没啥了,但是还是很难写 ...
- 「HNOI2016」序列 解题报告
「HNOI2016」序列 有一些高妙的做法,懒得看 考虑莫队,考虑莫队咋移动区间 然后你在区间内部找一个最小值的位置,假设现在从右边加 最小值左边区间显然可以\(O(1)\),最小值右边的区间是断掉的 ...
- 「HNOI2016」网络 解题报告
「HNOI2016」网络 我有一个绝妙的可持久化树套树思路,可惜的是,它的空间是\(n\log^2 n\)的... 注意到对一个询问,我们可以二分答案 然后统计经过这个点大于当前答案的路径条数,如果这 ...
- 「HAOI2018」染色 解题报告
「HAOI2018」染色 是个套路题.. 考虑容斥 则恰好为\(k\)个颜色恰好为\(c\)次的贡献为 \[ \binom{m}{k}\sum_{i\ge k}(-1)^{i-k}\binom{m-k ...
- 「HNOI2016」最小公倍数 解题报告
「HNOI2016」最小公倍数 考虑暴力,对每个询问,处理出\(\le a,\le b\)的与询问点在一起的联通块,然后判断是否是一个联通块,且联通块\(a,b\)最大值是否满足要求. 然后很显然需要 ...
- 「SCOI2016」围棋 解题报告
「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...
- 「SCOI2016」妖怪 解题报告
「SCOI2016」妖怪 玄妙...盲猜一个结论,然后过了,事后一证,然后假了,数据真水 首先要最小化 \[ \max_{i=1}^n (1+k)x_i+(1+\frac{1}{k})y_i \] \ ...
随机推荐
- ios点击输入框,界面放大解决方案
当我们编写的input宽度没有占满屏幕宽度,而且又没有申明meta,就会出现点击输入框,界面放大这个问题. 下面我直接给出解决方案: <meta name="viewport" ...
- js 深度复制deepClone
function isObject(obj) { return typeof obj === 'object' && obj != null; } const deepClone =( ...
- [转帖]SAP一句话入门:Production Planning
SAP一句话入门:Production Planning http://blog.vsharing.com/MilesForce/A617692.html SAP是庞大的,模块是多多的,功能是强大的, ...
- 获取打开页面时的当前时间(yyyy-MM-dd hh:mm:ss)
Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d ...
- django restframework PrimaryKeyRelatedField筛选的困惑
一.在开发某运动app时,遇见以下情况 1.部分表内容如下: class Sports(models.Model): ''' 运动表 ''' school = models.ForeignKey(Sc ...
- springboot swagger2 泛型踩坑记
最近使用一些工具需要和swagger打通,swagger的格式总是不对. 后来查了一下:哈哈. https://blog.csdn.net/hupingjin/article/details/8299 ...
- linux 地址解析协议 arp
随便转载,保留出处:http://www.cnblogs.com/aaron-agu/ arp –na #查看 arp –s 123.253.68.209 00:19:56:6F:87:D4 #添加
- 创建一个UWP 打包签名
Create a certificate for package signing 2017/2/8 3 min to read [ Updated for UWP apps on Windows 10 ...
- Atcoder Beginner Contest 118 C-Monsters Battle Royale(贪心)
题目链接 题意就是要让给出的数字去互相取余,看看能得到最小的数事多少. 那么就可以从小到大排序,每一次都贪心地把最小的数作为攻击者,去攻击其他的数字(也就是大的取余小的),然后再一次排序,循环这个过程 ...
- 在 Activity 中实现 getContentView 操作
2017/9/8 17:17:03 前言 最近接到个需要优化Android原生系统设置APK的任务.这个任务里面有一个更换应用背景图片的需求.我手里的这个设备是一个平板设备,使用了一下这个 ...