题目链接:

https://jzoj.net/senior/#main/show/6101

题目:

题解:

设$f_i$表示从节点$i$到节点$n$的期望时间,$f_n=0$

最优策略就是如果从$i,j$之间存在边且$f_j<f_i$的话,那么就从$i$走到$j$

有$f_i=\frac{1}{m}(\sum_{link[i][j]=1}min(f_i,f_j))+1+\frac{m-du_i}{m}f_i$

$du_i$是$i$的度数

即$du_if_i=\sum_{link[i][j]=1}min(f_i,f_j)+m$

右边可以写成$vf_i+(\sum_{link[i][j]=1,f_j<f_i}f_j)$的形式

继续化简得到$(du_i-v)f_i=m+(\sum_{link[i][j]=1,f_j<f_i}f_j)$

注意到$du_i-v$与左边累加的$f_j$的个数是一样的

不妨设$z=du_i-v$,$s=\sum_{link[i][j]=1,f_i<f_j}f_j$

那么$f_i=\frac{s+m}{z}$

当我们要添加新的$f_j$来更新$f_i$时,设新加的$f_j$为$a$

$f_i^,=\frac{s+m+a}{z+1}$,假设$f_i^,<f_i$,即得到更优的答案

那么化简可得$f_j=a<\frac{s+m}{z}=f_i$,刚好满足约束条件$f_j<f_i$

即我们只要把比当前的$f_i$小的$f_j$用来更新$f_i$,那么就可以得到更优的答案

这个时候我们想到了类似$dijkstra$的算法,即每次取出最小的$f_i$来更新周围的点

虽然我仍然觉得代码的正确性并不显然,各位有什么好的想法可以告诉我

代码:

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
typedef double db; const int N=1e5+;
int n,m,tot;
int head[N],vis[N],cnt[N];
db sum[N];
struct EDGE
{
int to,nxt;
}edge[N<<];
struct node
{
int x,cnt;db sum;
};
priority_queue<node> q;
bool operator < (node a,node b) {return a.sum*b.cnt>b.sum*a.cnt;}
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void add(int u,int v)
{
edge[++tot]=(EDGE){v,head[u]};
head[u]=tot;
}
int main()
{
freopen("path.in","r",stdin);
freopen("path.out","w",stdout);
n=read();m=read();
for (int i=;i<=m;i++)
{
int u=read(),v=read();
add(u,v);add(v,u);
}
cnt[n]=;
q.push((node){n,,});
while (!q.empty())
{
int x=q.top().x;q.pop();
if (vis[x]) continue;
vis[x]=;
db val=(sum[x]+m*(x!=n))/(1.0*cnt[x]);
for (int i=head[x];i;i=edge[i].nxt)
{
int y=edge[i].to;
if (cnt[y]==||val*cnt[y]<(sum[y]+m))
{
sum[y]+=val;
cnt[y]++;
if (!vis[y]) q.push((node){y,cnt[y],sum[y]+m});
}
}
}
printf("%.10lf\n",(sum[]+m)/cnt[]);
return ;
}

[jzoj 6101] [GDOI2019模拟2019.4.2] Path 解题报告 (期望)的更多相关文章

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

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

  2. [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_ ...

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

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

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

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

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

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

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

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

  7. [jzoj 6084] [GDOI2019模拟2019.3.25] 礼物 [luogu 4916] 魔力环 解题报告(莫比乌斯反演+生成函数)

    题目链接: https://jzoj.net/senior/#main/show/6084 https://www.luogu.org/problemnew/show/P4916 题目: 题解: 注: ...

  8. [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)

    题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...

  9. [JZOJ 5885] [NOIP2018模拟9.27] 物理实验 解题报告 (思维)

    题目链接: https://jzoj.net/senior/#main/show/5885 题目: 题解: 把$a$数组按升序排序 我们可以枚举$x$,发现对于任意$x$,最优情况下$y$一定等于$x ...

随机推荐

  1. Three入门学习笔记整理

    一.官方网站:https://threejs.org 二.关于Three.js 三.开始 四.实例 基本结构 结果 五.概念 坐标系 场景 相机 灯光 3D模型 六.简单动画 七.交互控制 结束 # ...

  2. let,const,var三者之间的区别

    在ES6中新增了两种定义变量的命令let和const,在这之前相信大家都对var定义变量很熟悉,那么在了解ES6方法前, 1.我们先来回顾一下var定义变量的方法. 下面来看这段代码: for (va ...

  3. udacity_javascript设计模式

    javascript设计模式 的学习记录 在优达学城上找到的 <javascript设计模式> 他主要是带动我们的思考 在 <第二章 分离重构> 中使用了 model octo ...

  4. ubuntu+win10双系统,调整分区大小后进入了emergency mode

    问题背景: 装了Ubuntu+win10双系统,在Ubuntu下面挂载了Windows的D盘.后来因为D空间不够,进入Windows压缩C盘分区,扩大了D盘.重启后无法启动Ubuntu,进入了emer ...

  5. hdu 2444 The Accomodation of Students 判断是否构成二分图 + 最大匹配

    此题就是求最大匹配.不过需要判断是否构成二分图.判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图.声明一个vis[],初始化为-1.通过深搜,相邻的点不满足 ...

  6. dataAdapter

    public static class DataAdapter { /// <summary> /// DataRow转换成Hash对象 /// </summary> /// ...

  7. PowerDesigner 逆向工程 Could not Initialize JavaVM!

    原项目的大量的表,使用PowerDesigner 进行逆向工程.提示Could not Initialize JavaVM! 网上找到原因,PowerDesigner 不可以使用64位JDK环境! 有 ...

  8. 【从零开始】【Java】【3】改造成多模块项目

    闲聊 前几天还是太懒惰了,毕竟也是世界杯期间嘛,可以自我理解的,嘿嘿. 毕竟是从头开始,但是不一定适合所有新入门的人,所以搭框架啊.引入框架什么的,是占据最开始时间比较多的,代码层面的,可能要到靠后面 ...

  9. Kafka学习笔记(6)----Kafka使用Producer发送消息

    1. Kafka的Producer 不论将kafka作为什么样的用途,都少不了的向Broker发送数据或接受数据,Producer就是用于向Kafka发送数据.如下: 2. 添加依赖 pom.xml文 ...

  10. 如何在IE11中设置兼容模式?设置的具体方法

    IE11浏览器软件版本:简体中文正式版 For Win7网络工具立即查看 1.同样进入需要兼容性模式的网站,点击菜单栏位工具--F12开发者人员工具!如下图所示. 2.在开发者选项左下侧菜单栏位,点击 ...