题目描述

给定一张n个点,m条双向边的无向图。
你要从1号点走到n号点。当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点。
每当完成一次交易时,你可以选择直接使用那张票,也可以选择扔掉那张票然后再花1元钱随机买另一张票。注意你可以无限次扔票。
请使用最佳的策略,使得期望花的钱数最少。

输入

第一行包含两个正整数n,m(1<=n,m<=300000),表示点数和边数。
接下来m行,每行两个正整数u,v(1<=u,v<=n),表示一条双向边。
输入数据保证无重边、无自环,且1号点一定可以走到n号点。

输出

输出一行一个实数,即最少的期望花费,当绝对或者相对误差不超过10^{-6}时视为正确。

样例输入

5 8
1 2
1 3
1 4
2 3
2 4
3 5
5 4
2 5

样例输出

4.1111111111


题解

期望dp+堆优化Dijkstra

设 $f[i]$ 表示 $i$ 到终点的期望步数,那么有:$f[n]=0\ ,\ f[x]=\frac{\sum\limits_{(x,y)}\text{min}(f[x],f[y])+1}{d[x]}$ ,其中 $d[x]$ 表示 $x$ 的度数。

套路:对于这种 “初始只有一个点的dp值确定、其它点的dp值与其相邻的点有关” 的图上dp,考虑使用类似最短路的方式转移。

初始的时候除了 $n$ 以外,每个点的 $\text{min}(f[x],f[y])$ 都取 $f[x]$ ,dp值为 $+\infty$ 。

然后从 $n$ 号点开始最短路转移:对于当前的点 $i$ ,如果某个相邻的 $j$ 有 $f[j]>f[i]$ ,则对于 $f[j]$ 的计算来说,$\text{min}(f[j],f[i])$ 取 $f[i]$ 更优。此时更新 $j$ 的dp值,并将 $j$ 加入到待用于更新其它点的集合中。

注意到:如果使用 $f[i]$ 将 $f[j]$ 更新为 $f'[j]$ ,那么显然有 $f[i]\le f'[j]\le f[j]$ (等号在 $f[i]=f[j]$ 时取到),满足堆优化Dijkstra的贪心策略(当前最小的一定不会再被更新到更小),因此可以使用dp值小根堆来维护待用于更新其它点的集合,使用类似堆优化Dijkstra的方式转移即可。

最终的答案就是 $f[1]$ 。

时间复杂度 $O(m\log n)$

#include <queue>
#include <cstdio>
#include <algorithm>
#define N 300010
using namespace std;
typedef pair<double , int> pr;
priority_queue<pr> q;
double s[N] , f[N];
int head[N] , to[N << 1] , next[N << 1] , cnt , vis[N] , d[N] , c[N];
inline void add(int x , int y)
{to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
int main()
{int n , m , i , x , y;scanf("%d%d" , &n , &m);for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x) , d[x] ++ , d[y] ++ ;q.push(pr(0 , n));while(!q.empty()){x = q.top().second , q.pop();if(vis[x]) continue;vis[x] = 1;for(i = head[x] ; i ; i = next[i])if(!vis[to[i]])c[to[i]] ++ , s[to[i]] += f[x] , f[to[i]] = (s[to[i]] + d[to[i]]) / c[to[i]] , q.push(pr(-f[to[i]] , to[i]));}printf("%lf\n" , f[1]);return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/8507379.html

【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra相关推荐

  1. [BZOJ5197] [CERC2017]Gambling Guide

    [BZOJ5197] [CERC2017]Gambling Guide 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5197 Solut ...

  2. Luogu4745/Gym101620G CERC2017 Gambling Guide 期望、DP、最短路

    传送门--Luogu 传送门--Vjudge 设\(f_x\)为从\(x\)走到\(N\)的期望步数 如果没有可以不动的限制,就是隔壁HNOI2013 游走 如果有可以不动的限制,那么\(f_x = ...

  3. BZOJ5197:[CERC2017]Gambling Guide(最短路,期望DP)

    Description 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易 ...

  4. bzoj5197:[CERC2017]Gambling Guide

    传送门 好像概率期望也写过一些题了,但是没啥用,还是不会套路,看了题解才会写 首先设\(f[x]\)为\(x\)到\(n\)的期望最少步数,\(deg_x\)表示\(x\)的度数 不考虑不动,显然\( ...

  5. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  6. 【BZOJ5197】Gambling Guide (最短路,期望)

    [BZOJ5197]Gambling Guide (最短路,期望) 题面 BZOJ权限题 洛谷 题解 假设我们求出了每个点的期望,那么对于一个点,只有向期望更小的点移动的时候才会更新答案. 即转移是: ...

  7. bzoj 3040: 最短路(road)(堆优化dijkstra)

    3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MB Submit: 2811  Solved: 933 [Submit][Status][ ...

  8. HDU1535 Invitation Cards(链式前向星+堆优化dijkstra)[C++]

    目录 题目及翻译 题面 输入 输出 输入样例 输出样例 题目思路 注意事项 AC代码 C++ 题目及翻译 题面 In the age of television, not many people at ...

  9. 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra

    题目描述 Tim正在摆弄着他设计的"计算机",他认为这台计算机原理很独特,因此利用它可以解决许多难题.  但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很 ...

最新文章

  1. 2015年的计算机二级考试题,2015年计算机二级考试《VFP》精选上机练习题
  2. 利用My97DatePicker实现年份多选
  3. vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
  4. OpenCV中的函数子
  5. 通过GeoIP获取ip所属地 (国家,城市,时区,邮编,经纬度等)
  6. jsp和mysql乱码
  7. python求平均工资_python如何求列表平均值?
  8. 定做属于自己的Lodop安装程序
  9. Javascript标准参考教程学习记录
  10. [转]Java计时器Timer 使用
  11. python查看数据库存在表_python sqlite3查看数据库所有表(table)
  12. 华表Cell的网页插件在IE8中无法显示的问题 | #华表Cell #报表 #IE8
  13. 正运动技术 运动控制卡应用开发教程之C#
  14. 高通设备进入高通9008模式
  15. 挖数据平台推出实时汇率API接口
  16. 高德定位,只能定位一次,导航图标就消失
  17. PYTHON使用chinese_calendar判断日期是否为节假日
  18. 霍夫变换到广义霍夫变换
  19. 微信支付APP支付完全攻略
  20. 计算机通信与网络安全国际会议,第一届计算机通信与网络安全国际学术会议(CCNS2020)...

热门文章

  1. PyODPS学习:使用DataFrame实现SQL的IF判断
  2. PowerDesigner脚本使用记录
  3. 通讯传输--全双工和半双工
  4. Spring MVC 接收请求参数所有方式总结!
  5. 9000+ 字,彻底征服 Spring AOP ,美滋滋
  6. 微服务为什么一定要Zookeeper?
  7. Spring@Cacheable注解在类内部调用失效的问题
  8. 使用Nomad构建弹性基础架构: 容错和中断恢复
  9. spring mvc事务没有生效的原因
  10. 监控系统或者网站服务器的报警及复位,机房监控系统标准和常见故障