【BZOJ3470】Freda’s Walk

Description

雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步。 Poetic Island的交通可以看作一张n个点、m 边的有向无环图。由于刚下过雨,每条边都有一个积水深度,而恰好Freda 和Rainbow都喜欢踩水玩儿,于是Ta们从某个点出发,选择走向哪条边的概率与该边的积水深度是成正比的。即:如果Freda和Rainbow现在在点u,点u 出发的所有边的积水深度之和为s,从u到v的边积水深度为w,那么Ta们选择走向v的概率就是 w/s。  
Ta们会一直走下去,直到到达一个没有出边的点,那么散步的路程长度就是走过的边的数量。更特殊的是,Freda和Rainbow在出发之前还可以选择一条边,在散步过程中无视这条边的存在(当然也可以不选择)。请你帮忙计算一下,Ta 们从0号点出发,散步的路程长度的期望值最大是多少?

Input

第一行两个正整数 n、m。 
接下来m行每行三个整数u、v、w,表示从u到v有一条无向边,积水深度为w。

Output

输出Freda和Rainbow散步的路程长度的最大期望值,四舍五入保留六位小数。

Sample Input

4 5
0 1 2
0 2 1
0 3 3
1 3 1
2 3 4

Sample Output

2.000000

HINT

对于  100% 的数据,2<=n<=10000,1<=m<=100000,0<=u,v<n,1<=w<=1000。

题解:由于是DAG,所以我们先反着跑拓扑排序,求出从每个点开始走的期望步数f[i],再正着跑拓扑排序,求出从0号点走到这个点的概率p[i]。

然后枚举删除那条边<a,b>。首先删除这条边会使答案减去p[a]*(f[b]+1),其次a的其他出边的概率都会增加。算一下贡献即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=10010;
const int maxm=100010;
int n,m,cnt;
int to[maxm],next[maxm],val[maxm],head[maxn],d[maxn],s[maxn],pa[maxm],pb[maxm],pc[maxm];
double ans;
double p[maxn],f[maxn];
queue<int> q;
inline void add(int a,int b,int c)
{to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
inline int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')    f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd();int i,u,a,b,c;memset(head,-1,sizeof(head)),cnt=0;for(i=1;i<=m;i++) a=pa[i]=rd()+1,b=pb[i]=rd()+1,c=pc[i]=rd(),add(b,a,c),s[a]+=c,d[a]++;for(i=1;i<=n;i++)   if(!d[i])   q.push(i);while(!q.empty()){u=q.front(),q.pop();for(i=head[u];i!=-1;i=next[i]){d[to[i]]--,f[to[i]]+=(f[u]+1)*val[i]/s[to[i]];if(!d[to[i]])   q.push(to[i]);}}memset(head,-1,sizeof(head)),cnt=0;for(i=1;i<=m;i++)    add(pa[i],pb[i],pc[i]),d[pb[i]]++;p[1]=1;for(i=1;i<=n;i++)    if(!d[i])   q.push(i);while(!q.empty()){u=q.front(),q.pop();for(i=head[u];i!=-1;i=next[i]){d[to[i]]--,p[to[i]]+=p[u]*val[i]/s[u];if(!d[to[i]])    q.push(to[i]);}}ans=f[1];for(i=1;i<=m;i++){a=pa[i],b=pb[i],c=pc[i];double g=(f[a]-(f[b]+1)*c/s[a])*s[a]/(s[a]-c)-f[a];ans=max(ans,f[1]+g*p[a]);}printf("%.6lf",ans);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7965528.html

【BZOJ3470】Freda’s Walk 概率与期望相关推荐

  1. bzoj3470 Freda's Walk (期望概率DP)

    bzoj3470 Freda's Walk 原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3470 题意: 有向无环图,求从点0出发,走到一 ...

  2. BZOJ 3470 Freda’s Walk (期望)

    3470: Freda's Walk Time Limit: 1 Sec Memory Limit: 128 MB Description 雨后的Poetic Island空气格外清新,于是Freda ...

  3. 【BZOJ 3470】3470: Freda’s Walk 期望

    3470: Freda's Walk Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 42  Solved: 22 Description 雨后的Poe ...

  4. 【学习笔记】《概率与期望全家桶》(ACM / OI)概率与期望 / 概率论知识小结

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 这块知识很少,但是题很难- 目录 0x00 概率 0x01 基本概念 0x02 古典概率 0x03 条 ...

  5. 【学习笔记】信息学竞赛中的概率与期望小结

    信息竞赛--概率与期望 事件 事件的蕴含.包含 事件的互斥 事件的对立 事件的和(并) 事件的积(交) 事件的差 概率 事件的独立性 全概率公式 贝叶斯公式 概率DP(竞赛中的考察) 期望(竞赛中的考 ...

  6. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  7. 【学习小结】树上的概率、期望问题,树上高斯消元

    树上的概率和期望问题经常用到的思想是考虑父亲和孩子的转移关系 考虑父亲到孩子的概率或者期望通常需要先计算孩子到父亲的概率和期望 例题1 : 分别考虑每条边(两个方向)的贡献 在路径中每条边的贡献(走过 ...

  8. 概率与期望——P4316 绿豆蛙的归宿

    概率与期望--P4316 绿豆蛙的归宿 题目 算法分析 Code 反思与总结 题目 P4316 绿豆蛙的归宿 算法分析 要计算路径的总长度期望,可以将每一个结点看作一个阶段,用dpdpdp来实现.(看 ...

  9. 概率与期望——P1365 WJMZBMR打osu! / Easy

    概率与期望--P1365 WJMZBMR打osu! / Easy 题目 算法与分析 Code 反思与总结 题目 P1365 WJMZBMR打osu! / Easy 算法与分析 通过读题我们知道,有oo ...

最新文章

  1. 火星直播?一种可以给中国火星探测工程当云监工的方法
  2. 海明嵌入Hamming Embedding生成Binary Signature之matlab程序代码
  3. ​NVIDIA针对数据不充分数据集进行生成改进,大幅提高CIFAR-10数据生成
  4. opensource项目_最佳Opensource.com:法律
  5. 3位格雷码的顺序编码_第3部分-计算机程序员(FPGA嵌入式应用)_3级_理论知识复习题...
  6. 1个通用工具平台+多个热点场景工具套件,助力开发者快速构建应用
  7. 2022腾讯云学生服务器申请流程(全攻略)
  8. 实现spring+mybatis+uncode dal,应用自动切换连接数据库
  9. php面试题之三——PHP语言基础(基础部分)
  10. 中国黑科技惊艳MWC2018 柔性显示引领“泛在屏”时代
  11. Google 搜索知识
  12. vue+tsx初体验
  13. 小程序源码:仿各大APP种树微信小程序源码下载-简单快速上手
  14. CV、CA、CT运动模型的理解和matlab程序简单实现
  15. Pytorch | 报错The given NumPy array is not writeable,and PyTorch does not support non-writeable tensor
  16. 剑网三怎么查看服务器角色信息,剑网3如何获取角色?以下这些获取方式请全部掌握!...
  17. es ik 多字段查询_SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询...
  18. 万象物语怎么在电脑上玩 万象物语电脑版玩法教程
  19. QT里面Q_PROPERTY的使用
  20. 谷粒商城商品规格数据结构学习笔记(SPUSKU)

热门文章

  1. DM8在银河麒麟服务器上配置Oracle19c的DBLINK服务
  2. 数论-FTT 和 NTT
  3. Win10自动更新永久关闭,有效的Win10强制更新关闭方法,禁止windows10自动更新,禁止update medic service ,win10显示更新并关机没有单独的关机按钮
  4. 靠本事整塌,靠苦逼重搭
  5. Android开发替换字体
  6. 汇编语言(第三版)第十章 CALL 和 RET 指令 笔记
  7. 新来的CTO规定所有接口都用 post 请求...
  8. 史上最全的CDN内容分发网络实战技巧
  9. 发布镜像【DockerHub或阿里云】
  10. Devtools下载添加到谷歌扩展程序