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\)

然后弄完权值直接跑矩阵树定理就好

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. #include<map>
  8. #include<set>
  9. #define mk make_pair
  10. #define ll long long
  11. #include<ctime>
  12. using namespace std;
  13. inline int read()
  14. {
  15. int x=0,f=1;char ch=getchar();
  16. while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
  17. while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  18. return x*f;
  19. }
  20. const int maxn = 110;
  21. const double eps = 1e-6;
  22. double a[maxn][maxn];
  23. double d[maxn];
  24. int n;
  25. double ans=1;
  26. void gauss()
  27. {
  28. int k=1;
  29. for (int i=1;i<=n;i++)
  30. {
  31. int now = k;
  32. while(now<=n && fabs(a[now][i])<=eps) now++;
  33. if (now==n+1) continue;
  34. for (int j=1;j<=n+1;j++) swap(a[now][j],a[k][j]);
  35. for (int j=1;j<=n;j++)
  36. {
  37. if (j!=k)
  38. {
  39. double t = a[j][i]/a[k][i];
  40. for (int p=1;p<=n+1;p++) a[j][p]-=t*a[k][p];
  41. }
  42. }
  43. ++k;
  44. }
  45. for (int i=1;i<=n;i++)
  46. ans=ans*a[i][i];
  47. }
  48. double ymh=1;
  49. int main()
  50. {
  51. n=read();
  52. for (int i=1;i<=n;i++)
  53. for (int j=1;j<=n;j++)
  54. {
  55. double x;
  56. scanf("%lf",&x);
  57. if (x==1) x = 1-eps;
  58. if (i<j) ymh=ymh*(1-x);
  59. x=x/(1-x);
  60. a[i][j]=-x;
  61. d[i]+=x;
  62. //d[j]+=x;
  63. }
  64. for (int i=1;i<=n;i++) a[i][i]=d[i];
  65. gauss();
  66. printf("%.5lf",ans*ymh);
  67. return 0;
  68. }

洛谷3317 SDOI2014重建(高斯消元+期望)的更多相关文章

  1. 洛谷P2455 [SDOI2006]线性方程组(高斯消元)

    题目描述 已知n元线性一次方程组. 其中:n<=50, 系数是[b][color=red]整数<=100(有负数),bi的值都是整数且<300(有负数)(特别感谢U14968 mmq ...

  2. 【洛谷P3389】(模板)高斯消元

    对于高斯消元法求解线性方程组, 我的理解就类似于我们在做数学题时的加减消元法, 只是把它写成一个通用的程序运算过程 对于一个线性方程组,我们从左往右每次将一列对应的行以下的元通过加减消元消去, 每个元 ...

  3. HDU2262;Where is the canteen(高斯消元+期望)

    传送门 题意 给出一张图,LL从一个点等概率走到上下左右位置,询问LL从宿舍走到餐厅的步数期望 分析 该题是一道高斯消元+期望的题目 难点在于构造矩阵,我们发现以下结论 设某点走到餐厅的期望为Ek 1 ...

  4. 洛谷P3232 [HNOI2013]游走(高斯消元+期望)

    传送门 所以说我讨厌数学……期望不会高斯消元也不会……好不容易抄好了高斯消元板子被精度卡成琪露诺了…… 首先,我们先算出走每一条边的期望次数,那么为了最小化期望,就让大的期望次数乘上小编号 边的期望次 ...

  5. Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...

  6. BZOJ 3143 HNOI2013 游走 高斯消元 期望

    这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...

  7. BZOJ_3270_博物馆_(高斯消元+期望动态规划+矩阵)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3270 \(n\)个房间,刚开始两个人分别在\(a,b\),每分钟在第\(i\)个房间有\(p[ ...

  8. BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算

    BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...

  9. BZOJ 2707: [SDOI2012]走迷宫 拓扑+高斯消元+期望概率dp+Tarjan

    先Tarjan缩点 强连通分量里用高斯消元外面直接转移 注意删掉终点出边和拓扑 #include<cstdio> #include<cstring> #include<a ...

随机推荐

  1. vue+vant实现购物车的全选和反选业务,带你研究购物车的那些细节!

    前言 喜欢购物的小伙伴看过来,你们期待已久的购物车来啦!相信小伙伴逛淘宝时最擅长的就是加入购物车了,那购物车是如何实现商品全选反选的呢?今天就带你们研究购物车的源码,以vue+vant为例. 正文 首 ...

  2. .NetCore3.1获取文件并重新命名以及大批量更新及写入数据

    using Microsoft.AspNetCore.Mvc; using MySql.Data.MySqlClient; using System; using System.Collections ...

  3. golang sqlx

    在项目中我们通常可能会使用database/sql连接MySQL数据库.本文借助使用sqlx实现批量插入数据的例子,介绍了sqlx中可能被你忽视了的sqlx.In和DB.NamedExec方法. sq ...

  4. .Net Core 中的选项Options

    .NetCore的配置选项建议结合在一起学习,不了解.NetCore 配置Configuration的同学可以看下我的上一篇文章 [.Net Core配置Configuration源码研究] 由代码开 ...

  5. 20210821 打表,蛇,购物,ants

    考场 T1 没看懂 T4 一眼回滚莫队,但忘记怎么写了,小慌 模拟 T1 题意的时候教练让 zsy 澄清了一下,确定了我不会做... T2 一看就是毒瘤题,T3 感觉比较可做 T4 确定了回滚的细节, ...

  6. MongoDB(4)- Collection 集合相关

    Collection MongoDB 将文档存储在集合中 集合存储在 Database 中 集合类似于关系数据库(Mysql)中的表 如果集合不存在,则 MongoDB 会在第一次存储该集合数据时创建 ...

  7. python3 爬虫五大模块之三:网页下载器

    Python的爬虫框架主要可以分为以下五个部分: 爬虫调度器:用于各个模块之间的通信,可以理解为爬虫的入口与核心(main函数),爬虫的执行策略在此模块进行定义: URL管理器:负责URL的管理,包括 ...

  8. 第08课:GDB 实用调试技巧( 上)

    本节课的核心内容: 将 print 打印结果显示完整 让被 GDB 调试的程序接收信号 函数明明存在,添加断点时却无效 将 print 打印结果显示完整 当使用 print 命令打印一个字符串或者字符 ...

  9. JS020. Array map()函数查到需要的元素时跳出遍历循环,不再执行到数组边界

    Array.prototype.map() map( )  方法创建一个 新数组 *,其结果是该数组中的每个元素是调用一次提供的 函数后的返回值 *.[ MDN / RUNOOB ] * map 添加 ...

  10. 排查dubbo接口重复注销问题,我发现了一个巧妙的设计

    背景 我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错.经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会 ...