【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述
输入
输出
样例输入
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相关推荐
- [BZOJ5197] [CERC2017]Gambling Guide
[BZOJ5197] [CERC2017]Gambling Guide 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5197 Solut ...
- Luogu4745/Gym101620G CERC2017 Gambling Guide 期望、DP、最短路
传送门--Luogu 传送门--Vjudge 设\(f_x\)为从\(x\)走到\(N\)的期望步数 如果没有可以不动的限制,就是隔壁HNOI2013 游走 如果有可以不动的限制,那么\(f_x = ...
- BZOJ5197:[CERC2017]Gambling Guide(最短路,期望DP)
Description 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易 ...
- bzoj5197:[CERC2017]Gambling Guide
传送门 好像概率期望也写过一些题了,但是没啥用,还是不会套路,看了题解才会写 首先设\(f[x]\)为\(x\)到\(n\)的期望最少步数,\(deg_x\)表示\(x\)的度数 不考虑不动,显然\( ...
- luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...
- 【BZOJ5197】Gambling Guide (最短路,期望)
[BZOJ5197]Gambling Guide (最短路,期望) 题面 BZOJ权限题 洛谷 题解 假设我们求出了每个点的期望,那么对于一个点,只有向期望更小的点移动的时候才会更新答案. 即转移是: ...
- bzoj 3040: 最短路(road)(堆优化dijkstra)
3040: 最短路(road) Time Limit: 60 Sec Memory Limit: 200 MB Submit: 2811 Solved: 933 [Submit][Status][ ...
- HDU1535 Invitation Cards(链式前向星+堆优化dijkstra)[C++]
目录 题目及翻译 题面 输入 输出 输入样例 输出样例 题目思路 注意事项 AC代码 C++ 题目及翻译 题面 In the age of television, not many people at ...
- 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra
题目描述 Tim正在摆弄着他设计的"计算机",他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很 ...
最新文章
- 2015年的计算机二级考试题,2015年计算机二级考试《VFP》精选上机练习题
- 利用My97DatePicker实现年份多选
- vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
- OpenCV中的函数子
- 通过GeoIP获取ip所属地 (国家,城市,时区,邮编,经纬度等)
- jsp和mysql乱码
- python求平均工资_python如何求列表平均值?
- 定做属于自己的Lodop安装程序
- Javascript标准参考教程学习记录
- [转]Java计时器Timer 使用
- python查看数据库存在表_python sqlite3查看数据库所有表(table)
- 华表Cell的网页插件在IE8中无法显示的问题 | #华表Cell #报表 #IE8
- 正运动技术 运动控制卡应用开发教程之C#
- 高通设备进入高通9008模式
- 挖数据平台推出实时汇率API接口
- 高德定位,只能定位一次,导航图标就消失
- PYTHON使用chinese_calendar判断日期是否为节假日
- 霍夫变换到广义霍夫变换
- 微信支付APP支付完全攻略
- 计算机通信与网络安全国际会议,第一届计算机通信与网络安全国际学术会议(CCNS2020)...