bzoj

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的更多相关文章

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

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

  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 3470: Freda’s Walk【拓扑排序+期望dp】

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

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. python os.walk()

    os.walk()返回三个参数:os.walk(dirpath,dirnames,filenames) for dirpath,dirnames,filenames in os.walk(): 返回d ...

  6. LYDSY模拟赛day1 Walk

    /* 依旧考虑新增 2^20 个点. i 只需要向 i 去掉某一位的 1 的点连边. 这样一来图的边数就被压缩到了 20 · 2^20 + 2n + m,然后 BFS 求出 1 到每个点的最短路即可. ...

  7. How Google TestsSoftware - Crawl, walk, run.

    One of the key ways Google achievesgood results with fewer testers than many companies is that we ra ...

  8. poj[3093]Margaritas On River Walk

    Description One of the more popular activities in San Antonio is to enjoy margaritas in the park alo ...

  9. os.walk()

    os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. walk()方法语法格式如下: os.walk(top[, topdown=True[, onerror=None[ ...

随机推荐

  1. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) Solution

    A. Altruistic Amphibians Upsolved. 题意: $有n只青蛙,其属性用三元组表示 <l_i, w_i, h_i> l_i是它能跳的高度,w_i是它的体重,h_ ...

  2. 20155201 2016-2017-2《Java程序设计》课程总结

    20155201 2016-2017-2<Java程序设计>课程总结 目录 一.每周作业链接汇总 二.实验报告链接汇总 三.代码托管链接 四.课堂项目实践 五.课程收获与不足 六.问卷调查 ...

  3. usb_submit_urb

    hub_irq() --> usb_submit_urb() usb_start_wait_urb() --> usb_submit_urb() 一旦urb被USB驱动程序正确地创建和初始 ...

  4. 【Java----判断字符串是否为有效的日期格式】

    public static boolean isValidDate(String str) { boolean convertSuccess=true; // 指定日期格式为四位年/两位月份/两位日期 ...

  5. SpringBoot与Dubbo整合上篇

    最近学习了一下dubbo,是阿里巴巴公司的一个开源服务框架.目前我们公司实现两个不同系统的之间通信,是采用了Oracle的OSB作为服务的管理(即企业服务总线的一种实现),服务提供方在OSB上注册业务 ...

  6. GET 和 POST 方法的区别

    GET 和 POST 是 HTTP 请求的两种基本方法,最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参数. 一些标准的区别: 1. GET 在浏览 ...

  7. Codeforces Round #408 (Div. 2) C. Bank Hacking

    http://codeforces.com/contest/796/problem/C Although Inzane successfully found his beloved bone, Zan ...

  8. lapply

    正如前面展示的,lapply( )函数接收一个向量和一个函数作为输入参数.它将这个函数应用到向量中的每个元素,再将结果以列表的形式返回.当每次迭代都是相互独立时,这个函数就非常好用.因为在这种情况下, ...

  9. Kotlin中的object 与companion object的区别

    之前写了一篇Kotlin中常量和静态方法的文章,最近有人提出一个问题,在companion object中调用外部的成员变量会调用不到,这才意识到问题,本篇文章会带着这个疑问来解决问题. 一. obj ...

  10. 递归--练习6--noi1755菲波那契数列

    递归--练习6--noi1755菲波那契数列 一.心得 二.题目 1755:菲波那契数列 总时间限制:  1000ms 内存限制:  65536kB 描述 菲波那契数列是指这样的数列: 数列的第一个和 ...