[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[ ...
随机推荐
- swoole gets
控制器调用: function gets() { $model = Model('ap_pic'); $model->select = ' id, size_type '; $gets['pag ...
- 线程、进程、daemon、GIL锁、线程锁、递归锁、信号量、计时器、事件、队列、多进程
# 本文代码基于Python3 什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行 ...
- IDFA踩坑记录
IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...
- ABP官方文档翻译 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- VC++使用HOOK API 屏蔽PrintScreen键截屏以及QQ和微信默认热键截屏
转载:http://blog.csdn.net/easysec/article/details/8833457 转载:http://www.vckbase.com/module/articleCont ...
- Python学习札记(三十八) 面向对象编程 Object Oriented Program 9
参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...
- Scikit-learn 库的使用
1. 与文本处理相关的库 1. 对语料库提取特征词集合 from sklearn.feature_extraction.text import TfidfVectorizer, CountVector ...
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(dfs)
http://codeforces.com/contest/761/problem/E 题意:给出一棵树,现在要把这棵树上的结点放置在笛卡尔坐标上,使得每一条边与x轴平行或者与y轴平行.输出可行解,即 ...
- C++总结:C++中的const和constexpr
C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象 ...
- 自己喜欢用的一个初始化的common.css
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, p, blockquote ...