【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;
}
【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra的更多相关文章
- [BZOJ5197] [CERC2017]Gambling Guide
[BZOJ5197] [CERC2017]Gambling Guide 题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5197 Solut ...
- 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra
题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...
- 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】Gambling Guide (最短路,期望)
[BZOJ5197]Gambling Guide (最短路,期望) 题面 BZOJ权限题 洛谷 题解 假设我们求出了每个点的期望,那么对于一个点,只有向期望更小的点移动的时候才会更新答案. 即转移是: ...
- 【bzoj4016】[FJOI2014]最短路径树问题 堆优化Dijkstra+DFS树+树的点分治
题目描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径( ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
随机推荐
- 2017-2018-1 20155321《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155321<信息安全技术>实验二--Windows口令破解 实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理 ...
- Android开发——你真的了解Dialog、Toast和Snackbar吗
0. 前言 今天给大家带来一篇简单易懂的关于Android提醒小功能的文章.Dialog和Toast我们都不陌生,而Snackbar是Design Support库中提供的新控件,有些朋友可能还不了解 ...
- loj2538 「PKUWC 2018」Slay the Spire
pkusc 快到了--做点题涨涨 rp. ref我好菜啊QAQ. 可以发现期望只是一个幌子.我们的目的是:对于所有随机的选择方法(一共 \(\binom{2n}{m}\)种),这些选择方法都最优地打出 ...
- Azkaban 工作流调度器
Azkaban 工作流调度器 1 概述 1.1 为什么需要工作流调度系统 a)一个完整的数据分析系统通常都是由大量任务单元组成,shell脚本程序,java程序,mapreduce程序.hive脚本等 ...
- 验证码示例代码演示——以php为例
运行 · 修改index.php(图片验证码的生成示例) [html] view plain copy initNECaptcha({ captchaId: 'YOUR_CAPTCHA_ID', // ...
- 从源码角度彻底理解ReentrantLock(重入锁)
目录 1.前言 2.AbstractQueuedSynchronizer介绍 2.1 AQS是构建同步组件的基础 2.2 AQS的内部结构(ReentrantLock的语境下) 3 非公平模式加锁流程 ...
- 2018百度之星开发者大赛-paddlepaddle学习(二)将数据保存为recordio文件并读取
paddlepaddle将数据保存为recordio文件并读取 因为有时候一次性将数据加载到内存中有可能太大,所以我们可以选择将数据转换成标准格式recordio文件并读取供我们的网络利用,接下来记录 ...
- Laya 自适应 不拉伸处理
Laya.init(640, Laya.Browser.width / 640 * 1028, WebGL); Laya.stage.scaleMode = "fixedwidth" ...
- LeetCode 845——数组中的最长山脉
1. 题目 2. 解答 2.1 方法一 left 数组表示当前元素左边比当前元素小的元素个数,right 数组数组表示当前元素右边比当前元素小的元素个数.在山脉的中间 B[i] 处,其左边和右边肯定都 ...
- SAP(ABAP) ABAP内部外部数据转换常用function
文本相关CONVERSION_EXIT_CUNIT_OUTPUT 将内部单位转为单位文本CONVERSION_EXIT_ISOLA_OUTPUT 根据语言代码取文本CONVERSI ...