3470: Freda’s Walk

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 42  Solved: 22

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。

Source

【分析】

  测试考这题。。错误打法 考场上竟然AC了【黑人问号脸??

  也算给自己提个醒吧,DAG和树终究是不一样的。不能f[i][0]和f[i][1]表示后面割还是没割,比如:

  

  割3后面那条边是f[2][1]和f[3][1],但是不会让他们转移到f[1][1],因为你规定只有一个儿子可以选割,但是是可以的,因为只是个割了3下面那条边。。

  所以这个方法不行。

  考虑割一条边对答案的影响。

  假设割x->y,只会影响f[x]以及1到x路径上的点。

  但是我们只需要知道x的f值的改变对1这个点的f值的影响。

  假设从1走到x的概率是p,假设那么f[1]会增加(f[x]'-f[x])*p,直接枚举割哪条边然后计算出这个求max就好了。

  【ORZORZORZ...

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 100010
#define Maxm 1000010 struct node
{
int x,y,c,next,p;
}t[Maxm],tt[Maxm];
int first[Maxn],len;
int d[Maxn]; int ft[Maxn];
void ins(int x,int y,int c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
t[len].next=first[x];first[x]=len;t[len].p=;
tt[len].x=y;tt[len].y=x;tt[len].c=c;tt[len].next=ft[y];ft[y]=len;
} bool vis[Maxn];
double g[Maxn];
void dfs2(int x)
{
if(vis[x]) return;vis[x]=;
if(x==) {g[x]=;return;}
for(int i=ft[x];i;i=tt[i].next)
{
int y=tt[i].y;
dfs2(y);
g[x]+=g[y]*tt[i].c*1.0/d[y];
}
} double f[Maxn];
void dfs(int x)
{
if(vis[x]) return;vis[x]=;
f[x]=;
for(int i=first[x];i;i=t[i].next) if(t[i].p)
{
int y=t[i].y;
dfs(y);
f[x]+=(f[y]+)*t[i].c*1.0/d[x];
}
return;
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
len=;
memset(first,,sizeof(first));
memset(ft,,sizeof(ft));
for(int i=;i<=m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
x++;y++;
d[x]+=c;
ins(x,y,c);
}
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++) g[i]=;
for(int i=;i<=n;i++) dfs2(i);
memset(vis,,sizeof(vis));
dfs();
double mx=f[];
for(int i=;i<=len;i++)
{
int x=t[i].x,y=t[i].y;
double ad;
if(d[x]!=t[i].c) ad=(f[x]*d[x]*1.0/(d[x]-t[i].c)-(f[y]+)*t[i].c*1.0/(d[x]-t[i].c))-f[x];
else ad=-f[x];
mx=max(mx,f[]+g[x]*ad);
}
printf("%.6lf\n",mx);
return ;
}

2017-04-24 18:51:22

【BZOJ 3470】3470: Freda’s Walk 期望的更多相关文章

  1. 【BZOJ3470】Freda’s Walk 概率与期望

    [BZOJ3470]Freda’s Walk Description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一 ...

  2. bzoj 3470: Freda’s Walk【拓扑排序+期望dp】

    dfs会T,只好正反两遍拓扑了-- #include<iostream> #include<cstdio> #include<queue> #include< ...

  3. [BZOJ3470]Freda’s Walk

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

  4. bzoj 1419 Red is good(期望DP)

    [题意] R红B蓝,选红得1选蓝失1,问最优状态下的期望得分. [思路] 设f[i][j]为i个Rj个B时的最优期望得分,则有转移式为: f[i][j]=max{ 0,(f[i-1][j]+1)*(i ...

  5. BZOJ 3036: 绿豆蛙的归宿( 期望dp )

    从终点往起点倒推 . 在一个图 考虑点 u , 出度为 s : s = 0 , d[ u ] = 0 ; s ≠ 0 , 则 d( u ) = ( ∑ d( v ) ) / s ( ( u , v ) ...

  6. bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]

    4872: [Shoi2017]分手是祝愿 题意:n个灯开关游戏,按i后i的约数都改变状态.随机选择一个灯,如果当前最优策略\(\le k\)直接用最优策略.问期望步数\(\cdot n! \mod ...

  7. BZOJ 1076: [SCOI2008]奖励关 [DP 期望 状压]

    传送门 题意:$n$种宝物,出现$k$次每次一种,每种宝物有价值和吃掉它之前必须要吃掉的宝物的集合,求采取最优策略的期望最大价值 1<=k<=100,1<=n<=15,分值为[ ...

  8. BZOJ 3091: 城市旅行 [LCT splay 期望]

    3091: 城市旅行 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1454  Solved: 483[Submit][Status][Discuss ...

  9. bzoj 1076 奖励关 状压+期望dp

    因为每次选择都是有后效性的,直接dp肯定不行,所以需要逆推. f[i][j]表示从第i次开始,初始状态为j的期望收益 #include<cstdio> #include<cstrin ...

随机推荐

  1. halcon发布

    1: halcon发布 : 在MFC程序中 添加 #include "include/halcon/cpp/HalconCpp.h"using namespace Halcon;# ...

  2. python 面试题3

    注:本面试题来源于网络. 1.python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一 ...

  3. 【C++】数组-整数从大到小排序

    1.实现过程 定义整型数组src,长度为10,初始化为{11,12,47,24,49,69,90,89,18,39}.之后用嵌套for循环比较相邻两个元素的大小,如果前一个元素大于后一个,不做任何操作 ...

  4. C#匿名函数与Lambda表达式

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.在C#中的Linq中的大部分就是由扩展方法 ...

  5. C基础 - 终结 Size Balanced Tree

    引言 - 初识 Size Balanced Tree 最近在抽细碎的时间看和学习 random 的 randnet 小型网络库. iamrandom/randnet - https://github. ...

  6. idea git revert 究竟做了啥

    git里面实现撤销commit 这个据我目前所知,有至少4个途径可以做到 1.git reset 2.git revert 3.git rm –cached 4.git checkout 这个可以参考 ...

  7. Spring MVC参数注入注意事项

    1.类参数名不能出现‘name’ 2.需提供默认的无参构造

  8. 使用插件实现Jenkins参数化构建

    一.插件安装 1.打开插件管理,在此界面可以安装插件 二.参数化 1.在“可选插件”中查找如下两个插件然后安装,安装后重启Jenkins Build With Parameters 输入框式的参数 P ...

  9. MyEclipse自带且常用的快捷键和自己定义的快捷键方法步骤

    1.MyEclipse自带且常用的快捷键 内容提示(补全): Alt+/    导包快捷键: Ctrl+Shift+o    格式化代码: Ctrl+Shift+f    行代码位置上下调换: Alt ...

  10. OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换

    1:读入图像,显示图像与保存图像 代码: import cv2 img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR) cv2.namedWindow('lena',c ...