Input

数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数。 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号。 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路。 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A。 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连。

Output

输出1个实数,四舍五入保留三位小数,表示平均多少个时间单位后聪聪会把可可吃掉。
对于所有的数据,1≤N,E≤1000。
对于50%的数据,1≤N≤50。

Sample Input

9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9

Sample Output

2.167

题解:

本题是一道难度适中的概率dp,其实坑点误区全部在读题上.

首先,要注意"第一步没走到,可以再走一步";其次,还有"距离相等时走编号较小的点".

前者保证猫一定追的上老鼠,后者则是一个决策的限制,让我们不能瞎跑题目变的难了

既然有这个限制,n也很小,我们就可以考虑打个表预处理

设du[i]为每个点的度

对于猫在i点,鼠在j点的情况,设pre[i][j]为猫下一步到达的节点(即决策点)

再设twice为猫走第一步到pre[i][j]没捉到鼠第二步的决策,则twice=pre[pre[i][j]][j]

那么有如下情况:

1°i==j:f[i][j]=0;

2°pre[i][j]==j||twice==j:f[i][j]=1;

如果1°2°均不满足,则

3°f[i][j]=(f[twice][j]+sigma{f[twice][k],j和k间有连边}/(du[j]+1)+1

这样本题就被解决啦,方式当然是记忆化搜索

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=;
int n,m,st1,st2;
struct node{int zhong,next;}s[N<<];
int e,adj[N],du[N],pre[N][N];
inline void add(int qi,int zhong){s[++e].zhong=zhong;s[e].next=adj[qi];adj[qi]=e;}
double f[N][N];
inline int spfa(int st)
{
queue<int>q;
int dis[N];bool vis[N];
memset(dis,0x7f,sizeof(dis));
memset(vis,,sizeof(vis));
q.push(st);pre[st][st]=st;dis[st]=;
while(!q.empty())
{
int rt=q.front();q.pop();
for(int i=adj[rt];i;i=s[i].next)
{
int u=s[i].zhong;
if(dis[u]>dis[rt]+)
{
dis[u]=dis[rt]+;
if(rt==st)pre[st][u]=u;
else pre[st][u]=pre[st][rt];
}
else if(dis[u]==dis[rt]+&&pre[st][u]>pre[st][rt])
{
if(rt==st)pre[st][u]=u;
else pre[st][u]=pre[st][rt];
}
if(!vis[u])vis[u]=,q.push(u);
}
}
}
inline double dp(int st,int ed)
{
if(st==ed)return f[st][ed]=;
int twice=pre[pre[st][ed]][ed];
if(pre[st][ed]==ed||twice==ed)return f[st][ed]=;
if(f[st][ed])return f[st][ed];
double k=1.0/(du[ed]+);
f[st][ed]=k*dp(twice,ed)+;
for(int i=adj[ed];i;i=s[i].next)
{
int u=s[i].zhong;
f[st][ed]+=k*dp(twice,u);
}
return f[st][ed];
}
int main()
{
scanf("%d%d%d%d",&n,&m,&st1,&st2);
int a,b;
for(int i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
du[a]++,du[b]++;
}
for(int i=;i<=n;i++)spfa(i);//用spfa预处理决策pre[i][j]
printf("%.3lf",dp(st1,st2));
}

[BZOJ1415]聪聪和可可的更多相关文章

  1. 【bzoj1415】 Noi2005—聪聪和可可

    http://www.lydsy.com/JudgeOnline/problem.php?id=1415 (题目链接) 题意 一张图,聪聪想吃可可.每单位时间聪聪可以先移动两次:可可后移动一次或停在原 ...

  2. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

    [BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...

  3. bzoj1415[NOI2005]聪聪和可可

    之前做的一些图上的期望步数的题大多用到高斯消元来求解(HNOI游走,SDOI走迷宫,etc),因此我一开始做这道题的时候想偏了- 这道题的性质:聪聪和可可之间的最短路长度严格递减.因为聪聪总可以多走一 ...

  4. 【BZOJ1415】 [Noi2005]聪聪和可可 概率与期望

    其实题不难,不知提交了几次...不能代码MD...注意一些基本问题...SB概率题 #include <iostream> #include <cstdio> #include ...

  5. BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  6. 【bzoj1415】[Noi2005]聪聪和可可 期望记忆化搜索

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  7. BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】

    题目 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  8. BZOJ1415 聪聪和可可 —— 期望 记忆化搜索

    题目链接:https://vjudge.net/problem/HYSBZ-1415 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 16 ...

  9. bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415 noip2016 D1T3,多么痛的领悟...看来要恶补一下与期望相关的东西了. 这是 ...

随机推荐

  1. CSS3 & SVG 制作钟表

    在线演示      源码下载

  2. 2017百度web前端实习生在线笔试题

    代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s ...

  3. Java工程中使用Mybatis (工程结合Mybatis,数据可以结合Swing使用)

    2011年6月iBatis 更名为 MyBatis,从 iBatis 到 MyBatis,不只是名称上的变化,MyBatis 提供了更为强大的功能,同时并没有损失其易用性,相反,在很多地方都借助于 J ...

  4. vsftp使用方法与问题解决

    安装环境 OS:Centos 6.4 vsftp:vsftpd-2.2.2-11.el6_3.1.i686.rpm vsftpd配置文件:/etc/vsftpd/vsftpd.conf 一.      ...

  5. Android自定义评分控件:RatingStarView

    RatingStarView Android自定义的评分控件,类似ProgressBar那样的,使用星星图标(full.half.empty)作为progress标识的评分/打分控件. 效果图 图1: ...

  6. 利用PHPExcel读取Excel的数据和导出数据到Excel

    PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel.也是我们日常开发中,经常会遇到的使用场景.比如有个客户信息表,要批量导出发给同事,我 ...

  7. [大数据]-Elasticsearch5.3.1 IK分词,同义词/联想搜索设置

    --题外话:最近发现了一些问题,一些高搜索量的东西相当一部分没有价值.发现大部分是一些问题的错误日志.而我是个比较爱贴图的.搜索引擎的检索会将我们的博文文本分词.所以图片内容一般是检索不到的,也就是说 ...

  8. 深度解析MySQL启动时报“The server quit without updating PID file”错误的原因

    很多童鞋在启动mysql的时候,碰到过这个错误, 首先,澄清一点,出现这个错误的前提是:通过服务脚本来启动mysql.通过mysqld_safe或mysqld启动mysql实例并不会报这个错误. 那么 ...

  9. java之 Timer 类的使用以及深入理解

    最近一直在看线程知识,然后看到Timer定时器使用了线程实现的定时功能,于是了解了解: 本文 从Time类的使用和源码分析两个方面讲解: 1---Timer类使用 2---源码分析 1.Time类使用 ...

  10. C#中string,char[],byte[]互相转换

    string 转换成 Char[] string ss = "我爱你,中国"; char[] cc = ss.ToCharArray(); Char[] 转换成string str ...