Description

题库链接

一只猫和一只老鼠在一张 \(n\) 个节点和 \(m\) 条边的无向图上,初始位置不同。对于每一时刻,猫会先走,它走的方向为靠近老鼠的方向;若多个节点可选,则选字典序最小的那个。同时若走出这步后没有抓到老鼠,则可按同样方式再走一步;接着老鼠会等概率的停在原地或者随机走向一个相邻的节点。问抓到老鼠的期望时间。

\(1\leq n,m\leq 1000\)

Solution

首先注意到这样一句话“若走出这步后没有抓到老鼠,则可按同样方式再走一步”,显然是能够保证猫一定能抓到老鼠。并且猫和老鼠两个所处位置的状态是具有层次性的。

容易发现老鼠的移动是没有规律的,即是随机的。而猫的动作是有规律的。

我们可以事先预处理出一个 \(pre_{u,v}\) 数组,表示猫在 \(u\) 处,老鼠在 \(v\) 处时,猫下一个选择要走的节点是哪一个,可以用 \(n\) 次 \(SPFA\) 预处理出来,由于边数和点数是同阶的,复杂度可以得到保障。

我们可以设出一个 \(dp\) 数组 \(f_{u,v}\) 表示猫在 \(u\) 处,老鼠在 \(v\) 处时期望走的时间为 \(f_{u,v}\) 。

首先显然当 \(u=v\) 时, \(f_{u,v}=0\) ;其次若 \(pre_{u,v}=v\) 即走出一步抓到老鼠或者 \(pre_{pre_{u,v},v}=v\) 即走出两步抓到老鼠, \(f_{u,v}=1\) 。

这时剩下的情况就是老鼠会移动。

由于猫会先走,猫移动之后老鼠再走;显然猫移动结束后停在的位置为 \(pre_{pre_{u,v},v}\) 。

设节点 \(v\) 以及和 \(v\) 相邻的节点的集合为 \(\mathbb{V}\) ,节点 \(v\) 的度数为 \(degree_v\) 。显然答案就是 \[f_{u,v}=\frac{\sum\limits_{x\in\mathbb{V}}f_{pre_{pre_{u,v},v},x}}{degree_v+1}+1\]

记忆化搜索实现。

Code

//It is made by Awson on 2018.2.24
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 1000;
void read(int &x) {char ch; bool flag = 0;for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());x *= 1-2*flag;
}
void print(LL x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(LL x) {if (x < 0) putchar('-'); print(Abs(x)); }int n, m, s, t, u, v;
struct tt {int to, next; }edge[(N<<1)+5];
int path[N+5], top, degree[N+5];
int pre[N+5][N+5]; double f[N+5][N+5];
queue<int>Q;
int vis[N+5], dist[N+5];void add(int u, int v) {edge[++top].to = v, edge[top].next = path[u], path[u] = top, ++degree[u]; }
void get_pre(int x) {memset(dist, 127/3, sizeof(dist)); dist[x] = 0, vis[x] = 1; Q.push(x);while (!Q.empty()) {int u = Q.front(); Q.pop(); vis[u] = 0;for (int i = path[u]; i; i = edge[i].next)if (dist[edge[i].to] > dist[u]+1) {dist[edge[i].to] = dist[u]+1;if (!vis[edge[i].to]) vis[edge[i].to] = 1, Q.push(edge[i].to);if (u == x) pre[x][edge[i].to] = edge[i].to; else pre[x][edge[i].to] = pre[x][u];}else if (dist[edge[i].to] == dist[u]+1 && pre[x][edge[i].to] > pre[x][u]) pre[x][edge[i].to] = pre[x][u];}
}
double dp(int s, int t) {if (s == t) return 0;int nex = pre[pre[s][t]][t];if (pre[s][t] == t || nex == t) return f[s][t] = 1;if (f[s][t] != 0) return f[s][t];double k = 1/(1.0*(degree[t]+1)); f[s][t] = 1+dp(nex, t)*k;for (int i = path[t]; i; i = edge[i].next) f[s][t] += k*dp(nex, edge[i].to);return f[s][t];
}
void work() {read(n), read(m); read(s); read(t);for (int i = 1; i <= m; i++) read(u), read(v), add(u, v), add(v, u);for (int i = 1; i <= n; i++) get_pre(i);printf("%.3lf\n", dp(s, t));
}
int main() {work(); return 0;
}

转载于:https://www.cnblogs.com/NaVi-Awson/p/8465730.html

[NOI 2005]聪聪和可可相关推荐

  1. NOI 2005 聪聪可可

    1784 聪聪与可可 2005年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 在一个魔法森林里,住着一只 ...

  2. NOI 2005 聪聪与可可 题解

    题目传送门 题目大意: 给出一张无向图,起点终点为 S,TS,TS,T,聪聪站在起点,可可站在终点,可可每回合随机走 111 步,也可能不动,聪聪则会每回合沿最短路向他走两步,每回合聪聪先走,问聪聪期 ...

  3. noi题目P4206 [NOI2005] 聪聪与可可

    题目描述 在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可.虽 然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠, 同样不变的是,聪聪成天想着要吃掉可可. 一天,聪聪 ...

  4. [Noi2005]聪聪和可可

    [Noi2005]聪聪和可可 Time Limit:10000MS  Memory Limit:65536K Total Submit:21 Accepted:14 Description Input ...

  5. NKOJ 3893 聪聪和可可(数学期望+递推+最短路)

    P3893[概率]聪聪和可可 问题描述 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和 ...

  6. BZOJ 2152 「国家集训队」聪聪可可(点分治)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2152 是 hydro 的 BZOJ ...

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

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

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

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

  9. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1640  Solved: 962 Description ...

  10. Bzoj 2152: 聪聪可可(点分治)

    2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MB Submit: 2683 Solved: 1420 [Submit][Status][Discuss ...

最新文章

  1. 面试题 16.19.水域大小
  2. 关于 SAP Spartacus UI 框架选型问题
  3. GAN全套学习笔记/论文
  4. 【渝粤教育】国家开放大学2018年秋季 1174t水工钢筋混凝土结构(本) 参考试题
  5. 第三方支付接口对接基本流程
  6. 项目管理知识体系指南 (一)
  7. 探索无止境,解决问题才是根本
  8. 信息系统项目管理师计算题(期望值)
  9. 喜欢艾弗森,退役了。。。
  10. phpcms富文本框上传图片去除水印
  11. 中国上市互联网公司市值排名
  12. 打开ftp服务器上的文件时发生错误。请检查是否有权限访问该文件夹
  13. 【图像处理】道格拉斯-普克算法(曲线的折线段逼近)
  14. 重磅 | 推荐一款技术人必备的写作神器 (支持多平台博客群发)
  15. C#,图像二值化(04)——全局阈值的凯勒算法(Kittler Thresholding)及源程序
  16. 教你一招,千次单价至少翻3倍,做自媒体有播放量收益低怎么办?
  17. 和 Node.js 创始人 Ryan Dahl 的对话
  18. 今天给大家分享的是关于地理空间的数据分析
  19. R语言使用table函数和xtabs函数计算获取二维列联表(TWO-WAY TABLES)的语法、使用xtabs函数计算获取二维列联表(TWO-WAY TABLES)
  20. 快速排序的两种实现 -- 种轴partition : 比值partition(更精巧)

热门文章

  1. Android 如何保存图片
  2. STM32启动文件的分析
  3. MySQL安装配置教程-win10
  4. 通过OSS浏览器劫持阿里云Bucket
  5. 使用阿里云部署Web项目后无法通过浏览器访问
  6. 浩方、vs 等对战平台的危险
  7. X86主板设计: INTEL-965G平台
  8. 多租户与多用户的区别
  9. 小程序经济大爆发,微信向左,百度向右
  10. 基于TCP协议RSA与Base64加密的聊天程序