洛谷3317 SDOI2014重建(高斯消元+期望)
qwq
一开始想了个错的做法。
哎
直接开始说比较正确的做法吧。
首先我们考虑题目的\(ans\)该怎么去求
我们令\(x\)表示原图中的某一条边
\[ans = \sum \prod_{x\in tree} p_x \prod_{x\ not\in tree} (1-p_x)\]
qwq而根据矩阵树定理,我们可以求出来所有生成树的边权乘积的和,也就是前一部分。
现在我们考虑应该怎么优化第二部分。
qwq
我们经过推理能发现,我们可以用总的除去在生成树里面的求出来不在生成树里面的。
也就是说
\[\prod_{x\ not \in tree} (1-p_x)= \frac{\prod (1-p_i)}{\prod_{x\in tree} (1-p_j)}\]
我们带回原柿,然后把\(\prod (1-p_i)\)提出来
\[ans = \prod (1-p_x) \times \sum \prod_{x \in tree} \frac{p_x}{1-p_x}\]
那么现在,对于后面那一项,我们只需要把所有的边都设成权值是\(\prod_{x \in tree} \frac{p_x}{1-p_x}\)
然后每个\(d[i]\)表示与他连接的所有边权的和。
直接跑矩阵树定理就能求出来\(sum\)啦,然后直接用一开始求的\(\prod p_x\),一减就OK了
但是这里有一个需要注意的地方就是当\(p_x\)等于\(1\)的时候,我们应该将他的权值设成\(1-eps\)
因为当\(p\)等于1的时候,\(\frac{1}{1-p} -> inf\)
然后有因为\(\frac{1}{eps}->inf\)
所以\(p=1-eps\)
然后弄完权值直接跑矩阵树定理就好
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
#include<ctime>
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
const int maxn = 110;
const double eps = 1e-6;
double a[maxn][maxn];
double d[maxn];
int n;
double ans=1;
void gauss()
{int k=1;for (int i=1;i<=n;i++){int now = k;while(now<=n && fabs(a[now][i])<=eps) now++;if (now==n+1) continue;for (int j=1;j<=n+1;j++) swap(a[now][j],a[k][j]);for (int j=1;j<=n;j++){if (j!=k){double t = a[j][i]/a[k][i];for (int p=1;p<=n+1;p++) a[j][p]-=t*a[k][p];}}++k;}for (int i=1;i<=n;i++)ans=ans*a[i][i];
}
double ymh=1;
int main()
{n=read();for (int i=1;i<=n;i++)for (int j=1;j<=n;j++){double x;scanf("%lf",&x);if (x==1) x = 1-eps;if (i<j) ymh=ymh*(1-x);x=x/(1-x);a[i][j]=-x;d[i]+=x;//d[j]+=x;}for (int i=1;i<=n;i++) a[i][i]=d[i];gauss();printf("%.5lf",ans*ymh);return 0;
}
转载于:https://www.cnblogs.com/yimmortal/p/10152025.html
洛谷3317 SDOI2014重建(高斯消元+期望)相关推荐
- 洛谷 P5027 Barracuda(高斯消元)
题目链接 Barracuda 题目背景 小正方形的冒险旅途,并不顺利. 一路上,小正方形看到了壮美秀丽的小岛被污染,看到了雄伟壮观的火山,还碰到了许许多多的敌人. 眼下,小正方形正在对付一个巨大的三角 ...
- [BZOJ 3143][Hnoi2013]游走(高斯消元+期望)
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- BZOJ 3143: [Hnoi2013]游走 高斯消元 期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3463 Solved: 1535 [Submit][Stat ...
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)
传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...
- 洛谷 - P4783 【模板】矩阵求逆(高斯消元求逆矩阵)
题目链接:点击查看 题目大意:给出一个 n * n 的矩阵,求出其逆矩阵,mod 为 1e9 + 7,若不存在输出 No Solution 题目分析:囤个模板,原理就是,初始时在原矩阵右侧设置一个单位 ...
- 【洛谷P3389】【模板】高斯消元
题目链接 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1, a2 .....an 和 b,代表一组方程. 输 ...
- 洛谷 P3211 [HNOI2011]XOR和路径(推dp+高斯消元)
传送门 首先,异或的话直接讨论不好讨论,那么我们可以按位讨论,对于每一位讨论出来一个结果,然后将结果相加就好了. 然后考虑怎么讨论一位上的结果. 我们可以设出来一个dp方程:f(i)表示i到n的异或和 ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- 高斯消元(Gaussian elimination)
我们将分两个部分来说明高斯消去,第一部分是数学方面,第二个部分是如何用 C++ 来实现. 第一部分 数学知识 什么是高斯消去 高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方 ...
最新文章
- 面试官:如何做 API 接口防刷??
- Windows10 中使用 virtualbox 安装ubuntu 虚拟机
- Nginx反向代理多个应用时,通过BluePring使Flask支持二级路径(URL前缀)
- SpringBoot底层注解-@ConfigurationProperties配置绑定
- 一个学校内部的计算机网络属于,一个教室内计算机联成的网络属于____。
- 红帽:将开源进行到底!
- 微软想证明Windows比Chrome好 主要源自恐惧?
- What's the difference between forever and for good?
- VMware Workstation Pro新建虚拟机的操作步骤(插图)
- rk3568 sensor调试记录
- [ZT]完全用Linux工作,摈弃Windows
- linux重置ilo,HP DL380 Gen9 服务器ilo密码忘记如何重置
- 中国气象局国家气候中心
- 安装jdk,没有jre
- TokenInsight 对话首席——获取增量用户 公链崛起的关键之战
- vue项目搭建以及环境配置
- n个整数,找出连续的m个数加和是最大
- “双指针”法解决链表问题
- 自助下单彩虹云商城系统2023最新免授权独立版源码安装教程
- php100以内质数求和,100以内的质数_PHP质数计算三种方法 php求100以内的质数