题意
给定一个无向图,你需要从1点出发到达n点,你在每一点的时候,使用1个单位的代价,随机得到相邻点的票,但是你可以选择留在原地,也可以选择使用掉这张票,
问到达n点的最小代价的方案的期望是多少。

分析

dp [i]  : 从I  到 n 需要coin  数量的期望
显然 dp[n]=。逆序更新 (除了dp[n] ,其他的全初始化为 inf)
如果当前点为u,v为u的相邻点。
v第一次被更新,那么 dp[v]=(deg[v]-)/deg[v]*dp[v]+/deg[v]*dp[u]+(+1是因为又需要一个coin)deg[v]- 为留在v点的概率,即dp[v]=((deg[v]-)*dp[v]+dp[u])/deg[v]+
数学变化后:dp[v]=deg[v]+dp[u]
如果当前点为 P,v为p的相邻点
如果 dp[v]>dp[p] ,那么v再次被更新,假设为第二次更新,那么:
dp[v]=((deg[v]-)*dp[v]+dp[u]+dp[p])/deg[v]+ 即 dp[v]=(dp[p]+dp[u]+deg[v])/
同理第n次更新时:dp[v]=(dp[u]+dp[p]+dp[q]+....+deg[v])/n
Used[v]:用来标记v现在是第几次被更新。可以得到:
double tmp = dp[v]*used[v];
used[v]++;
dp[v] = (tmp+xp)/used[v];
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N =;
double dp[N];
#define P pair<double,int>
const double inf = ;
int n,m,x,y;
bool vis[N];
int used[N],deg[N];
struct Node{
int fr,to,nex;
}e[N*];
int head[N],cnt;
void init()
{
for(int i =;i<N;i++)
{head[i] = -;
vis[i]=;
used[i]=;
deg[i]=;
}
cnt = ;
}
void add(int u,int v)
{
e[cnt].fr=u;e[cnt].to=v;
e[cnt].nex=head[u];head[u]=cnt++;
} void solve()
{
for(int i =;i<n;i++) dp[i] = inf; priority_queue<P,vector<P>,greater<P> >que;//是greater
que.push(P(,n));
vis[n] =;
while(!que.empty()){
P p =que.top();que.pop();
int u = p.second;double xp =p.first;
if(dp[u]<xp) continue;
for(int i =head[u];i+;i=e[i].nex){
Node nod = e[i];
int v=nod.to;
if(!vis[v]){
vis[v] = ;
used[v]=;
dp[v] = deg[v]+xp;
que.push(P(dp[v],v));
}
else if(dp[v]>xp){
double tmp = dp[v]*used[v];
//xp+=tmp; 这样 xp 在不断变化
used[v]++;
//dp[v]=xp/used[v];
dp[v] = (tmp+xp)/used[v];
que.push(P(dp[v],v));
}
}
} }
int main()
{ init();
scanf("%d%d",&n,&m);
for(int i =;i<m;i++){
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
deg[x]++;deg[y]++;
} solve();
printf("%.12f\n",dp[]);
return ;
}

CERC2017 Gambling Guide,最短路变形,期望dp的更多相关文章

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

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

  2. [BZOJ5197] [CERC2017]Gambling Guide

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

  3. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

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

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

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

  5. [CERC2017]Gambling Guide

    题目 看起来非常随机游走,但是由于我们可以停在原地,所以变得不是非常一样 设\(f_x\)表示从\(x\)到\(n\)的期望距离 如果我们提前知道了\(f\),那么我们随机到了一张到\(y\)的车票, ...

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

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

  7. 【bzoj4720】[Noip2016]换教室 期望dp+最短路

    Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的 ...

  8. 【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57148470 Descrition 首先很明显是 ...

  9. 【NOI2005】聪聪与可可 题解(最短路+期望DP)

    前言:学长讲的太神了:自己还能推出来DP式子,挺开心. -------------------------- 题目链接 题目大意:给定一张含有$n$个结点$m$条边的无向连通图.现在聪聪在点$s$,可 ...

随机推荐

  1. windows网络命令汇总

    分类: 网络技术2011-10-26 09:43 2557人阅读 评论(0) 收藏 举报 windows网络路由器dns服务器internetinterface Ping命令: ping命令通过发送I ...

  2. day2-基础 变量,判断,循环

    1.第一个程序 print ("Hello World!") 输出: 1 Hello World 2.第一个变量 a = ( print (a) 输出: Hello World 3 ...

  3. May 11th 2017 Week 19th Thursday

    If you fell down yesterday, stand up today. 昨天跌倒了,今天仍然要站起来. From Herbert George Wells. If you fell d ...

  4. April 1 2017 Week 13 Saturday

    There is more to life than increasing its speed. 生活不仅仅是匆匆赶路. Get a life, a real life, not a manic pu ...

  5. leetcode 322零钱兑换

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  6. Intellij idea创建(包、文件)javaWeb以及Servlet简单实现(Tomcat)

    准备:1. 安装jdk2. 安装tomcat 一.创建并设置javaweb工程 创建项目成功 创建包 创建Servlet 创建包成功,但是报错,原因是没有引入包 我们先表明 现在要引入servlet- ...

  7. Android学习笔记_1_拨打电话

    1.首先需要在AndroidManifest.xml文件中加入拨打电话的权限,对应的配置文件: <?xml version="1.0" encoding="utf- ...

  8. 我和我的广告前端代码(四):后台系统中,初尝vue、vue-cli

    有一段都在重构之前文章<我和我的广告前端代码(三):一次重来的机会,必要的技术选型>中提到的广告前台展示项目,原有的基于页面的请求,改成了单广告位请求在这个过程中经历了好几次架构变更以及项 ...

  9. mysql——约束

    非空约束: create table temp( id int not null, name varchar() not null default 'adc', sex char null )//给i ...

  10. c语言描述的顺序表实现

    //顺序表的实现:(分配一段连续地址给顺序表,像数组一样去操作) #include<stdio.h> #include<stdlib.h> #define OK 1 #defi ...