BZOJ 1415

简单期望 + 记忆化搜索。

发现聪聪每一步走向的地方是在可可的所在位置确定时是确定的,设$nxt_{x, y}$表示聪聪在$x$,可可在$y$时聪聪下一步会走到哪里,我们先预处理出这个$nxt$。

为了预处理$nxt$,我们还需要先预处理一个$d_{x, y}$表示$x$到$y$的最短距离,因为所有边的边权相同,所以我们第一次广搜到一个点的时候就是到这个点的最短路。

假如$d_{x, z} == d_{y, z} + 1$,$dis(x, y) == 1$,那么$z$就是$x$到$y$最短路上的一个点,用它更新$nxt_{x, y}$即可。

我们设$f_{x, y}$ 表示聪聪在$x$,可可在$y$时抓到可可的期望步数,显然有:

  $f_{x, y} == 0$  $(x == y)$

  $f_{x, y} == 1$  $(nxt_{x, y} == y)$  或者 $(nxt_{nxt_{x, y}, y} == y)$

而根据期望的性质,可可的随机行走可以表示成这个公式:

  $f_{x, y} = \frac{\sum _{z} f_{nxt_{nxt_{x, y}, y}, z}}{deg_y + 1} + 1$  $z == y$或者$z$可由$y$一步走到。

记忆化搜索实现。

时间复杂度$O(n^2)$。

Code:

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef double db; const int N = ;
const int inf = 0x3f3f3f3f; int n, m, st, ed, d[N][N];
int tot = , head[N], deg[N], nxt[N][N];
db f[N][N]; struct Edge {
int to, nxt;
} e[N << ]; inline void add(int from, int to) {
e[++tot].to = to;
e[tot].nxt = head[from];
head[from] = tot;
} inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void chkMin(int &x, int y) {
if(y < x) x = y;
} queue <int> Q;
inline void bfs(int fir, int *dis) {
Q.push(fir);
for(int i = ; i <= n; i++) dis[i] = inf;
dis[fir] = ; for(; !Q.empty(); ) {
int x = Q.front(); Q.pop();
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(dis[y] == inf) {
dis[y] = dis[x] + ;
Q.push(y);
}
}
}
} db dfs(int x, int y) {
if(f[x][y] != -1.0) return f[x][y];
if(x == y) return f[x][y] = 0.0;
if(nxt[x][y] == y) return f[x][y] = 1.0;
if(nxt[nxt[x][y]][y] == y) return f[x][y] = 1.0; db res = ;
for(int i = head[y]; i; i = e[i].nxt) {
int to = e[i].to;
res += dfs(nxt[nxt[x][y]][y], to);
}
res += dfs(nxt[nxt[x][y]][y], y); return f[x][y]= res / (deg[y] + ) + ;
} int main() {
read(n), read(m), read(st), read(ed);
for(int x, y, i = ; i <= m; i++) {
read(x), read(y);
add(x, y), add(y, x);
deg[x]++, deg[y]++;
} for(int i = ; i <= n; i++) bfs(i, d[i]); /* for(int i = 1; i <= n; i++, printf("\n"))
for(int j = 1; j <= n; j++)
printf("%d ", d[i][j]); */ memset(nxt, 0x3f, sizeof(nxt));
for(int x = ; x <= n; x++) {
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
for(int k = ; k <= n; k++)
if(d[x][k] == d[y][k] + )
chkMin(nxt[x][k], y);
}
} /* for(int i = 1; i <= n; i++, printf("\n"))
for(int j = 1; j <= n; j++)
printf("%d ", nxt[i][j]); */ for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
f[i][j] = -1.0; dfs(st, ed); printf("%.3f\n", f[st][ed]);
return ;
}

  

Luogu 4206 [NOI2005]聪聪与可可的更多相关文章

  1. luogu P4206 [NOI2005]聪聪与可可 期望dp 记忆化搜索

    LINK:聪聪与可可 这道题的核心是 想到如何统计答案. 如果设f[i][j]表示第i个时刻... 可以发现还需要统计位置信息 以及上一次到底被抓到没有的东西 不太好做. 两者的位置都在变化 所以需要 ...

  2. BZOJ 1415: [Noi2005]聪聪和可可( 最短路 + 期望dp )

    用最短路暴力搞出s(i, j)表示聪聪在i, 可可在j处时聪聪会走的路线. 然后就可以dp了, dp(i, j) = [ dp(s(s(i,j), j), j) + Σdp(s(s(i,j), j), ...

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

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

  4. 【NOI2005】聪聪和可可 概率与期望 记忆化搜索

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 958[Submit][Statu ...

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

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

  6. 【BZOJ】1415: [Noi2005]聪聪和可可【期望】【最短路】【记忆化搜索】

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2335  Solved: 1373[Submit][Stat ...

  7. 【BZOJ】【1415】【NOI2005】聪聪和可可

    数学期望+记忆化搜索 论文:<浅析竞赛中一类数学期望问题的解决方法>——汤可因  中的第一题…… Orz 黄学长 我实在是太弱,这么简单都yy不出来…… 宽搜预处理有点spfa的感觉= = ...

  8. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  9. P4206[NOI2005]聪聪与可可

    链接P4206 [NOI2005]聪聪与可可 类似于开车旅行,如果老鼠确定了那么猫的路线是确定的. 预处理\(g_{i,j}\)表示老鼠在\(i\)号点,猫的下一步方向,\(Bfs\)就行了 设\(f ...

随机推荐

  1. mac快捷键整理以及node的基本使用

    该文章是作为日常积累和整理,又是好久没有整理node的相关知识了,最近翻了翻自己的有道云笔记,怎一个乱字了的,重新整理下. 一.Mac常用快捷键 Command+M: 最小化窗口 Command+T: ...

  2. Redis底层探秘(六):对象多态及回收

    本篇是我们redis系列的最后一篇,整个系列其实是我学习<redis设计与实现>的笔记,这本书感觉不错,推荐使用redis的小伙伴都可以看看. 整个系列的文字都比较干,很多数据结构和C语言 ...

  3. 数字排列(n,m)(搜索与回溯)

    题目描述: 设有n个整数的集合{1,2,…,n},从中取出任意r个数进行排列(r<n),试列出所有的排列. 代码如下: #include<iostream>#include<c ...

  4. Python函数-map()

    map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回.如下: def ...

  5. BZOJ2527:[POI2011]Meteors

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  6. Ubuntu 16.04 LTS制作本地源

    平时apt-get install安装软件时,下载的deb文件都会存放在/var/cache/apt/archives/下,没有网络时就需要将这些deb制作成本地源.另外,如果在本机架一个简单的网络服 ...

  7. 【HTML代码】访问页面时,拨打页面中的电话号码

      这两天在写HTML页面今天要实现一个手机用户访问页面的时候,如果页面中有电话号码,点击可以打电话或者是发信息,之前没做过今天刚听说感觉很高大上会很难,实际上简单的让我内牛满面啊,,  小婊砸 (* ...

  8. DataX安装环境搭建

    DataX环境搭建 环境搭建 Java安装(java>=1.6) JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads ...

  9. Oracle 备份与恢复基础

    Oracle 备份与恢复基础 :三思笔记 备份与恢复 A whole database backup is either a consistent backup or an inconsistent ...

  10. spring学习十三

    1: RESTful URL : 域和端口 / servlet / 资源 / 参数id 2:  静态资源访问处理? 采用RESTful架构后,需要将web.xml中控制器拦截的请求设置为/,这样会将c ...