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. Spring的一些面试题(转)

    一.spring工作原理: 1.spring mvc的所有请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作.2.DispatcherServlet ...

  2. C#——文件操作类简单封装

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO ...

  3. 《Effective Java 2nd》第7章 方法

    目录 第38条 检查参数的有效性 第39条 必要时进行保护性拷贝 第40条 谨慎设计方法签名 第41条 慎用重载 第42条 慎用可变参数 第43条 返回零长度的数组或集合,而不是null 第44条 为 ...

  4. Vmware 设置NAT模式

    NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网.也就是说,使用NAT模式可以实现在虚拟系统里访问互联网. NAT模式下的虚拟系统的TCP/IP配置信息是由V ...

  5. js模拟类的创建以及继承的四部曲

    <script> 1)创建父类 function Person(){ } Person.prototype.age = 18;//给父类添加属性 var p1 = new Person() ...

  6. Mac下安装hexo Error: Cannot find module './build/Release/DTraceProviderBindings 解决

    参考: Github:Mac 下已经装了hexo,仍旧报错 官方文档 $ npm install hexo --no-optional if it doesn't work try $ npm uni ...

  7. Yii框架(二)Model处理数据

    熟悉php的autoload机制,自己实现一个autoload函数 一.复习框架: basic/ 应用根目录 composer.json Composer 配置文件, 描述包信息 config/ 包含 ...

  8. hdu 4739 Zhuge Liang's Mines DFS

    http://acm.hdu.edu.cn/showproblem.php?pid=4739 题意: 给定100*100的矩阵中n(n<= 20)个点,每次只能一走能够形成正方形的四个点,正方形 ...

  9. MQ是什么 RabbitMQ

    一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...

  10. 个人知识管理系统Version1.0开发记录(07)

    模 块 复 用 原本还要测试一会的,突然出现一连串诡异的问题,比如,编译少加载个类啊,输入地址少个字母啊,改几行代码一改就是半小时啊.这是在提醒我们大脑疲倦了,所以果断小结,下次继续.这一次简单完成了 ...