题目链接:https://jzoj.net/senior/#main/show/6101

记\(f_i\)为从\(i\)号点走到\(n\)号点所花天数的期望

那么根据\(m\)条边等可能的出现一条和一定会往期望值较小的点走的贪心策略我们可以得到

\[f_i=\frac{1}{m}\sum min(f_i,f_j)+1
\]

其中当\(i,j\)不相连的时候可将\(f_j\)看做无限大

我们考虑在该式子中一共选取了\(sum\)次\(f_j\),也就是\(m-sum\)次\(f_i\),那么

\[f_i=\frac{1}{m}(\sum _{f_j<f_i}f_j+(m-sum)*f_i)+1
\]

两边同时乘\(m\)并移项

\[sum*f_i=\sum f_j+m
\]

\[f_i=\frac{\sum f_j+m}{sum}
\]

我们将\(f_i\)看做到\(n\)点的距离,直接跑最短路,当从队列首部拎出来的\(u\)存在一条边\((u,v)\)使得当前的\(f_v\)比\(f_u\)大时就更新答案

那么我们如何维护这个优先队列呢?

我们假设当前用\(f_k\)去更新\(f_i\),那么就会有

\[\frac{\sum f_j+m+f_k}{sum+1}<\frac{\sum f_j+m}{sum}
\]

去分母化简得到

\[f_k<\frac{\sum f_j+m}{sum}
\]

所以直接按照\(\frac{\sum f_j+m}{sum}\)的值从小到大维护该队列即可

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,a,b) for (int i=a;i>=b;i--)
#define maxd 1000000007
typedef long long ll;
const int N=100000;
const double pi=acos(-1.0);
struct node{
int to,nxt;
}sq[200200]; struct hnode{
int u,sum;double f;
};
bool operator<(const hnode &p,const hnode &q)
{
return p.f*q.sum>q.f*p.sum;
}
priority_queue<hnode> q;
int n,m,all=0,head[100100],sum[100100];
double f[100100];
bool vis[100100]; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} void add(int u,int v)
{
all++;sq[all].to=v;sq[all].nxt=head[u];head[u]=all;
} double dij()
{
memset(vis,0,sizeof(vis));
sum[n]=1;q.push((hnode){n,1,0});
while (!q.empty())
{
int u=q.top().u;q.pop();
if (vis[u]) continue;
vis[u]=1;int i;
double now=(f[u]+m)/sum[u];
if (u==1) return (f[u]+m)/sum[u];
else if (u==n) now=0;
for (i=head[u];i;i=sq[i].nxt)
{
int v=sq[i].to;
if ((sum[v]==0) || ((f[v]+m)>now*sum[v]))
{
f[v]+=now;sum[v]++;
if (!vis[v]) q.push((hnode){v,sum[v],f[v]+m});
}
}
}
} int main()
{
freopen("path.in","r",stdin);
freopen("path.out","w",stdout);
n=read();m=read();
rep(i,1,m)
{
int u=read(),v=read();
add(u,v);add(v,u);
}
double ans=dij();
printf("%0.8lf",ans);
return 0;
}

jzoj6101. 【GDOI2019模拟2019.4.2】Path的更多相关文章

  1. [jzoj 6101] [GDOI2019模拟2019.4.2] Path 解题报告 (期望)

    题目链接: https://jzoj.net/senior/#main/show/6101 题目: 题解: 设$f_i$表示从节点$i$到节点$n$的期望时间,$f_n=0$ 最优策略就是如果从$i, ...

  2. jzoj6099. 【GDOI2019模拟2019.4.1】Dist

    题目链接:https://jzoj.net/senior/#main/show/6099 考虑直接统计某个点到其它所有点的距离和 我们先把整个团当成一个点建图,处理出任意两个团之间的距离\(dis(i ...

  3. [JZOJ6075]【GDOI2019模拟2019.3.20】桥【DP】【线段树】

    Description N,M<=100000,S,T<=1e9 Solution 首先可以感受一下,我们把街道看成一行,那么只有给出的2n个点的纵坐标是有用的,于是我们可以将坐标离散化至 ...

  4. [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)

    题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...

  5. [jzoj 6080] [GDOI2019模拟2019.3.23] IOer 解题报告 (数学构造)

    题目链接: https://jzoj.net/senior/#main/show/6080 题目: 题意: 给定$n,m,u,v$ 设$t_i=ui+v$ 求$\sum_{k_1+k_2+...+k_ ...

  6. [jzoj 6092] [GDOI2019模拟2019.3.30] 附耳而至 解题报告 (平面图转对偶图+最小割)

    题目链接: https://jzoj.net/senior/#main/show/6092 题目: 知识点--平面图转对偶图 在求最小割的时候,我们可以把平面图转为对偶图,用最短路来求最小割,这样会比 ...

  7. [jzoj 6086] [GDOI2019模拟2019.3.26] 动态半平面交 解题报告 (set+线段树)

    题目链接: https://jzoj.net/senior/#main/show/6086 题目: 题解: 一群数字的最小公倍数就是对它们质因数集合中的每个质因数的指数取$max$然后相乘 这样的子树 ...

  8. [jzoj 4528] [GDOI2019模拟2019.3.26] 要换换名字 (最大权闭合子图)

    题目链接: https://jzoj.net/senior/#contest/show/2683/0 题目: 题解: 不妨枚举一个点,让两颗树都以这个点为根,求联通块要么点数为$0$,要么包括根(即联 ...

  9. [jzoj 6087] [GDOI2019模拟2019.3.26] 获取名额 解题报告 (泰勒展开+RMQ+精度)

    题目链接: https://jzoj.net/senior/#main/show/6087 题目: 题解: 只需要统计$\prod_{i=l}^r (1-\frac{a_i}{x})$ =$exp(\ ...

随机推荐

  1. 下载Dynamics 365 Customer Engagement 工具

    微软动态CRM专家罗勇 ,回复312或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 从Dynamics ...

  2. 利用Azure虚拟机安装Dynamics CRM 2016实例

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复181或者20151215可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! Dynamics CRM Ser ...

  3. WGS84地理坐标系下,进行坐标运算

    经纬度坐标本身是不能直接运算的.原因是:经纬度坐标并非是直角坐标系.纬线圈间隔均匀,经线圈越靠近两级越密,如下图: 现在有个需求,已知两点和两点处射线斜率,求交点坐标. 虽然地球整体是个圆,但是局部地 ...

  4. clCreateBuffer和clCreateBuufer + clEnqueueWriteBuffer

    有两种方式实现从主机到CL设备的数据传递, 第一种: cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY,sizeof(float) * DA ...

  5. 关于如何使用xposed来hook某支付软件

    由于近期有业务上的需要,所以特地花时间去研究了一下如何使用hook技术.但是当我把xposed环境和程序编写完成时,突然发现手机上的某个支付软件无法使用了.这个时候我意识到,应该是该软件的安全机制在起 ...

  6. Edge BUG欣赏之四摸鸡与IP地址的恩怨

    <html><head>     <meta http-equiv="Content-Type" content="text/html; c ...

  7. MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现

    一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在 ...

  8. java实现Windows记事本

    给大家分享下我之前的作品: 源文件下载: 链接:https://pan.baidu.com/s/1N45VsS9aVgmvhvYjRLxBrA  提取码:b9fg  源码: JF_Notpad.jav ...

  9. python实例二

    https://www.cnblogs.com/evablogs/p/6754974.html 题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于 ...

  10. 龙尚 U9300C wvdial 拨号上网

    龙尚 U9300C    7模   4G LTE   (国内全网通) 接入linux系统会有4个串口 其中ttyUSB2 为AT指令口 ttyUSB1 为拨号上网口 wvdial   拨号入网参数 [ ...