[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 \le n \le 10000,1\le m\le 100000,0 \le u,v<n,1\le w\le1000\)。
sol
先正反建图跑出从每个点出发的期望行走步数\(f_i\)和从起点出发到达每个点的概率\(p_i\)。
枚举删掉一条边\((u,v)\),那么\(f_u\)中相应的会减少\(f_v\)的贡献,但其他出边贡献的比例则增大了,又因为\(f_i\)的一个变化量\(\Delta\)导致的\(f_1\)的变化量是\(p_i\Delta\),所以可以\(O(1)\)计算删掉每条边对答案的影响,取\(\max\)即可。
code
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 2e5+5;
int n,m,to[N],nxt[N],ww[N],hd1[N],hd2[N],cnt,du[N],sum[N];
double p[N],f[N],ans;
queue<int>Q;
void link(int v,int w,int &hd){
to[++cnt]=v;nxt[cnt]=hd;ww[cnt]=w;hd=cnt;
}
int main(){
n=gi();m=gi();
for (int i=1;i<=m;++i){
int u=gi()+1,v=gi()+1,w=gi();
link(v,w,hd1[u]);link(u,w,hd2[v]);sum[u]+=w;
}
for (int i=1;i<=n;++i)
for (int e=hd1[i];e;e=nxt[e])
++du[to[e]];
for (int i=1;i<=n;++i) if (!du[i]) Q.push(i);
p[1]=1;
while (!Q.empty()){
int u=Q.front();Q.pop();
for (int e=hd1[u];e;e=nxt[e]){
p[to[e]]+=p[u]*ww[e]/sum[u];
if (!--du[to[e]]) Q.push(to[e]);
}
}
for (int i=1;i<=n;++i)
for (int e=hd2[i];e;e=nxt[e])
++du[to[e]];
for (int i=1;i<=n;++i) if (!du[i]) Q.push(i);
while (!Q.empty()){
int u=Q.front();Q.pop();
for (int e=hd2[u];e;e=nxt[e]){
f[to[e]]+=(f[u]+1)*ww[e]/sum[to[e]];
if (!--du[to[e]]) Q.push(to[e]);
}
}
for (int i=1;i<=n;++i)
for (int e=hd1[i];e;e=nxt[e]){
double tmp=(f[i]-(f[to[e]]+1)*ww[e]/sum[i])*sum[i]/(sum[i]-ww[e]);
ans=max(ans,(tmp-f[i])*p[i]);
}
printf("%.6lf\n",ans+f[1]);
return 0;
}
[BZOJ3470]Freda’s Walk的更多相关文章
- 【BZOJ3470】Freda’s Walk 概率与期望
[BZOJ3470]Freda’s Walk Description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一 ...
- 【BZOJ 3470】3470: Freda’s Walk 期望
3470: Freda’s Walk Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 42 Solved: 22 Description 雨后的Poet ...
- bzoj 3470: Freda’s Walk【拓扑排序+期望dp】
dfs会T,只好正反两遍拓扑了-- #include<iostream> #include<cstdio> #include<queue> #include< ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- python os.walk()
os.walk()返回三个参数:os.walk(dirpath,dirnames,filenames) for dirpath,dirnames,filenames in os.walk(): 返回d ...
- LYDSY模拟赛day1 Walk
/* 依旧考虑新增 2^20 个点. i 只需要向 i 去掉某一位的 1 的点连边. 这样一来图的边数就被压缩到了 20 · 2^20 + 2n + m,然后 BFS 求出 1 到每个点的最短路即可. ...
- How Google TestsSoftware - Crawl, walk, run.
One of the key ways Google achievesgood results with fewer testers than many companies is that we ra ...
- poj[3093]Margaritas On River Walk
Description One of the more popular activities in San Antonio is to enjoy margaritas in the park alo ...
- os.walk()
os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. walk()方法语法格式如下: os.walk(top[, topdown=True[, onerror=None[ ...
随机推荐
- devise修改密码
https://ruby-china.org/topics/1314 password/edit不是给你直接改密码用的 这个是忘记密码后,发送重置密码的邮件到你邮箱,同时生成一个token 然后你点那 ...
- vim tab设置为4个空格
为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方法: 1. vim /etc/vimrc 1 set ts=4 2 set sw=4 2. vim /etc/vimrc 1 ...
- python一段代码 感受一下
class T(): def aa(self): write = 1 print '123' class B(): def hehe(self) ...
- ubuntu 中启动SDK manager
Android SDK安装后,目录结构如下: root@localhost:/home/ranxf/Android/Sdk/android-sdk-linux# ll 总用量 drwxrwxr-x r ...
- Ubuntu安装 jdk.rpm 报错问题解决
报错问题出现原因 第一次使用Ubuntu操作系统,很多命令及软件安装方式与以往使用的Linux操作系统(CentOS)有很大区别.现在总结使用Ubuntu在安装JDK中,遇到的问题及解决方法. roo ...
- 20145335郝昊《网络攻防》Bof逆向基础——ShellCode注入与执行
20145335郝昊<网络攻防>Bof逆向基础--ShellCode注入与执行 实验原理 关于ShellCode:ShellCode是一段代码,作为数据发送给受攻击服务器,是溢出程序和蠕虫 ...
- 20145325张梓靖 《Java程序设计》第5周学习总结
20145325张梓靖 <Java程序设计>第5周学习总结 教材学习内容总结 try catch Java中所有错误都会被打包为对象.如果某个方法声明会抛出Throwable或子类实例,只 ...
- CEF3开发者系列之CefEnableHighDPISupport详解
在CEF3中,CefEnableHighDPISupport()这个接口函数在使用时一般不为人所注意,但是如果稍有不慎,会造成打开的网页不能填满窗口的问题.如果是需要flash插件才能运行的游戏.则会 ...
- POJ 2486 Apple Tree(树形dp)
http://poj.org/problem?id=2486 题意: 有n个点,每个点有一个权值,从1出发,走k步,最多能获得多少权值.(每个点只能获得一次) 思路: 从1点开始,往下dfs,对于每个 ...
- sapply
列表并非总是存储结果的最佳容器.有时,我们希望将结果放在一个向量或者矩阵中.sapply( )函数可以根据结果的结构将其合理简化.假设,我们将平方运算应用到 1:10 的每个元素上.如果使用 lapp ...