【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;
}

【BZOJ3470】Freda’s Walk 概率与期望的更多相关文章

  1. [BZOJ3470]Freda’s Walk

    bzoj description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一张\(n\)个点.\(m\)边的有向 ...

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

    3470: Freda’s Walk Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 42  Solved: 22 Description 雨后的Poet ...

  3. 【BZOJ-3450】Tyvj1952Easy 概率与期望DP

    3450: Tyvj1952 Easy Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 468  Solved: 353[Submit][Status] ...

  4. 【BZOJ-4008】亚瑟王 概率与期望 + DP

    4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 832  Solved: 5 ...

  5. BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望

    BZOJ_4872_[Shoi2017]分手是祝愿_概率与期望 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这 ...

  6. 概率和期望dp

    概率和期望dp 概率和期望好神啊,完全不会. 网上说概率要顺着推,期望要逆着推,然而我目前做的概率期望题正好都与此相反2333   概率: 关于概率:他非常健康 初中概率题非常恐怖.现在来思考一道题: ...

  7. 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP

    [题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...

  8. 概率dp+期望dp 题目列表(一)

    表示对概率和期望还不是很清楚定义. 目前暂时只知道概率正推,期望逆推,然后概率*某个数值=期望. 为什么期望是逆推的,例如你求到某一个点的概率我们可以求得,然后我们只要运用dp从1~n每次都加下去就好 ...

  9. HDU 5159 Card (概率求期望)

    B - Card Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

随机推荐

  1. iOS边练边学--plist文件,懒加载,模型初使用--补充instancetype

    一.什么是plist文件 1>将数据直接写在代码里面,不是一种合理的做法.如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低 2>因此,可以考虑将经常变得数据放在文件中进行 ...

  2. rails中path、url路径解析,routes信息,form_for剖析,link_to示例,路由实例说明

    原创,转载请注明http://www.cnblogs.com/juandx/p/3963023.html  rails中path.url路径解析,routes信息,form_for剖析,link_to ...

  3. js学习笔记16----父节点的操作

    1.元素.parentNode : 只读属性,获取当前元素的父节点. 2.元素.offsetParent : 只读属性,获取离当前元素最近的一个有定位属性(position为relative或者abs ...

  4. 一段有用的javascript加密解密

    今天在做一个老项目时,遇到一个需求,在javascript将url中的参数加密解密,从网上找发现了这段有用的代码: <SCRIPT LANGUAGE="JavaScript" ...

  5. latex之转置符号

    $\mathbf{A}^\mathrm{T}$ $\mathbf{A}^\top$ $\mathbf{A}^\mathsf{T}$ $\mathbf{A}^\intercal$ 效果分别为:

  6. ubuntu下android源码的下载(最新)

    在ubuntu下下载android源码我断断续续搞了好几个月,希望大家不要向我学习啊!一次性搞定! 这里给大家一些建议啊,如果是看书的话看下书的出版日期,超过一年的基本上失效,网上的也是,特别是在国内 ...

  7. 关于Unity 获得和使用GetComponent<MeshFilter>().mesh时的心得

    原文地址:http://blog.sina.com.cn/s/blog_7d9405e50100s061.html 今天在使用Unity3D的时候遇到了一个问题:_tesGameObject是在Pro ...

  8. Linux 快速删除大量小文件方法

    进行以下两步操作即可: 1.第一步:创建空的文件夹: mkdir  /tmp/blank 2.第二步:执行以下命令:rsync --delete-before -d /tmp/blank/ /home ...

  9. 最全Java学习路线图——Java学习指南

    准备篇 适用/适合人群:适合基础小白 目标:掌握JavaSE. ●技术点小节: 1.开发工具的安装配置的介绍 2.JDK安装 3.DOS环境编程 4.Eclipse的安装使用 ●JAVA基础 1.基本 ...

  10. 如何用MathType编辑集合运算符号

    在涉及到集合的运算中,有交并且几种常见的运算,这在数学问题中也是很常见的公式.在用MathType编辑这些符号时,该怎么编辑呢?下面就介绍MathType集合运算符号的编辑方法. 具体操作过程如下: ...