【BZOJ3470】Freda’s Walk 概率与期望
【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
0 1 2
0 2 1
0 3 3
1 3 1
2 3 4
Sample Output
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;
- }
【BZOJ3470】Freda’s Walk 概率与期望的更多相关文章
- [BZOJ3470]Freda’s Walk
bzoj description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一张\(n\)个点.\(m\)边的有向 ...
- 【BZOJ 3470】3470: Freda’s Walk 期望
3470: Freda’s Walk Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 42 Solved: 22 Description 雨后的Poet ...
- 【BZOJ-3450】Tyvj1952Easy 概率与期望DP
3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 468 Solved: 353[Submit][Status] ...
- 【BZOJ-4008】亚瑟王 概率与期望 + DP
4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 832 Solved: 5 ...
- BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望
BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这 ...
- 概率和期望dp
概率和期望dp 概率和期望好神啊,完全不会. 网上说概率要顺着推,期望要逆着推,然而我目前做的概率期望题正好都与此相反2333 概率: 关于概率:他非常健康 初中概率题非常恐怖.现在来思考一道题: ...
- 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP
[题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...
- 概率dp+期望dp 题目列表(一)
表示对概率和期望还不是很清楚定义. 目前暂时只知道概率正推,期望逆推,然后概率*某个数值=期望. 为什么期望是逆推的,例如你求到某一个点的概率我们可以求得,然后我们只要运用dp从1~n每次都加下去就好 ...
- HDU 5159 Card (概率求期望)
B - Card Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
随机推荐
- Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发
Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 直接入正题: Screen Shot 2015-09-18 at 16.56.20.png Mac上安装Jekins jekins下 ...
- HTML(三):表单元素
表单元素概述 表单(Form),用于收集用户信息.提交用户请求等处理过程 1.设计表单,并放入一些输入域 2.网站访问者在自己的计算机上填写上述输入域,并提交到服务器端 ...
- eclipse lua
eclipse中的ldt插件是Lua Development Tools,开发lua专用的插件: 1.点击help->install new softWare,输入http://luaeclip ...
- Hbase建模
转自:http://blog.itpub.net/28912557/viewspace-1119865/ 什么情况下使用Hbase?1,成熟的数据分析主题,查询模式已经确定并且不易轻易改变.(主要还是 ...
- Json---Windows下使用Jsoncpp
上述Json解析使用的是Jsoncpp,要使用Jsoncpp,得做如下几步的配置: 1. 首先从http://sourceforge.net/projects/jsoncpp/下载,压缩包大约105k ...
- IoC最大的好处是什么?
IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有 ...
- R语言绘图边框的单位
在R语言中指定画图边框时,通常使用两种单位, lines 和 inches 当然,这两个单位之间是可以相互转换的,那么 1 inch = ? line 答案是1 inches = 5 lines 下面 ...
- 在VS中写js的同学注意了。。。。。。。。。。。。。。。。。。。
在vs中安装扩展jsdoc就可以实现这个功能
- jQuery中 wrap() wrapAll() 与 wrapInner()的差异
wrap() 方法把每个被选元素放置在指定的 HTML 内容或元素中.jQuery 文档操作 - wrapAll() 方法 wrapAll() 在指定的 HTML 内容或元素中放置所有被选的元素.jQ ...
- dwr框架使用总结——简单示例
1.新建web项目,项目名为dwr 2.导入以下jar包: dwr.jar.classes12.jar.commons-logging-1.0.4.jar和commons-logging.jar 3. ...