\(\\\)

\(Description\)


一张\(N\)个点,\(M\)条边的有向图中,猫在\(A\)点,鼠在\(B\)点,每一秒两者按照以下规则移动:

  • 猫先走去往老鼠所在地的最短路,可以走一步或两步,多条路径的话走点编号最小的。
  • 鼠等概率移动到直接连通的一个点或不动(概率为\(\frac{1}{deg_v+1}\))。

当任意时刻猫到达鼠所在地时鼠被吃掉,求鼠被吃掉的期望时间。

  • \(N,M\in [0,10^3]\)

\(\\\)

\(Solution\)


BZOJ200题达成纪念

  • 注意到图非常稀疏,可以\(SPFA\)预处理出,对于任意点对\((x,y)\),\(x\)按规则走向\(y\)的第一步去往的点\(next[x][y]\)。

  • 具体操作是现对每个点跑一遍\(SPFA\),设\(dis[u][v]\)表示从\(u\)到\(v\)的最短路长度,则所找的点的编号\(next[x][y]=min\{v|dis[v][y]+1=dis[x][y]\}\)。那么对于每一个要处理的猫和鼠的地点\((A,B)\),猫下一步到达的点就是\(next[next[A][B]][B]\)。

  • 注意到猫每一秒都会向靠近鼠的方向移动两步,而鼠每一秒会向不确定的方向移动一步,所以鼠是一定会被吃掉的,不妨暴力\(dfs\)下去找到猫捉到鼠的时间。而搜索状态量过多,所以需要记忆化。设\(f[i][j]\)表示猫在\(i\)号节点,鼠在\(j\)号节点时时间的期望,那么初始化就是\(f[i][i]=0,f[i][j]=1\big|dis[i][j]\le 2,i\not=j\)。

  • 然后记搜就可以了,转移方程很好理解,就是猫走向该走的地方,鼠下一步枚举,没搜过就搜一下:

    \[f[i][j]=\frac{\sum_{dis[j][v]=1}f\big[next[next[i][j]][j]\big]\big[v\big]\ +\ f\big[next[next[i][j]][j]\big]\big[j\big]}{deg[j]+1}+1
    \]

\(\\\)

\(Code\)


#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1010
#define R register
#define gc getchar
#define inf 2000000000
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} bool vis[N];
double f[N][N];
int n,m,s,t,tot,hd[N],d[N][N],deg[N],nxt[N][N]; struct edge{int to,nxt;} e[N<<1];
inline void add(int u,int v){
e[++tot].to=v; e[tot].nxt=hd[u]; hd[u]=tot;
} queue<int> q;
inline void bfs(int x){
q.push(x); d[x][x]=0;
while(!q.empty()){
int u=q.front(); q.pop(); vis[u]=0;
for(R int i=hd[u],v;i;i=e[i].nxt)
if(d[x][v=e[i].to]>d[x][u]+1){
d[x][v=e[i].to]=d[x][u]+1; if(!vis[v]) vis[v]=1,q.push(v);
}
}
} inline void dfs(int u,int v){
double res=0.0;
int nu=nxt[nxt[u][v]][v];
for(R int i=hd[v],nv;i;i=e[i].nxt){
if(f[nu][nv=e[i].to]<-10) dfs(nu,nv);
res+=f[nu][nv];
}
if(f[nu][v]<-10) dfs(nu,v);
f[u][v]=(res+f[nu][v])/(deg[v]+1)+1;
} int main(){
n=rd(); m=rd(); s=rd(); t=rd();
for(R int i=1,u,v;i<=m;++i){
u=rd(); v=rd(); add(u,v); add(v,u);
}
for(R int i=1;i<=n;++i)
for(R int j=1;j<=n;++j) d[i][j]=nxt[i][j]=inf,f[i][j]=-(double)inf;
for(R int i=1;i<=n;++i) bfs(i);
for(R int i=1;i<=n;++i)
for(R int j=1;j<=n;++j)
if(d[i][j]<inf) for(R int k=hd[i],v;k;k=e[k].nxt)
if(d[v=e[k].to][j]+1==d[i][j]) nxt[i][j]=min(nxt[i][j],v);
for(R int i=1;i<=n;++i){
for(R int j=1;j<=n;++j) if(d[i][j]<=2) f[i][j]=1;
f[i][i]=0;
for(R int j=hd[i];j;j=e[j].nxt) ++deg[i];
}
if(f[s][t]<-1) dfs(s,t);
printf("%.3lf\n",f[s][t]);
return 0;
}

[ NOI 2005 ] 聪聪与可可的更多相关文章

  1. 洛谷 P4206 [NOI2005]聪聪与可可 题解

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

  2. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

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

    题目链接:聪聪和可可 一道水题--开始还看错题了,以为边带权--强行\(O(n^3)\)预处理-- 首先,我们显然可以预处理出一个数组\(p[u][v]\)表示可可在点\(u\),聪聪在点\(v\)的 ...

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

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

  5. bzoj1415[NOI2005]聪聪和可可

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

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

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

  7. NOI2005 聪聪和可可

    Sol 记忆化搜索. \(f[u][v]\) 表示聪聪在 \(u\) ,可可在 \(v\) ,聪聪抓到可可的期望. 预处理出 \(u\) 到 \(v\) 最短路径编号最小的点,记为 \(g[u][v] ...

  8. BZOJ 2152: 聪聪可可 树分治

    2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  9. bzoj 2152聪聪可可

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MB Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰 ...

  10. HYSBZ - 2152 聪聪和可可

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

随机推荐

  1. node-sass 安装失败

    安装 npm install 时偶尔遇到报错:没有安装python或node-sass 安装失败的问题,百度之后发现是被墙了,但根据百度的方法换了淘宝镜像和用了vpn都安装失败, 原因可能是没有卸载之 ...

  2. 【Codeforces 411A】Password Check

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 傻逼模拟题 [代码] import java.io.*; import java.util.*; public class Main { st ...

  3. JavaSE 学习笔记之API(二十一)

    API--- java.lang.Runtime: 类中没有构造方法,不能创建对象. 但是有非静态方法.说明该类中应该定义好了对象,并可以通过一个static方法获取这个对象.用这个对象来调用非静态方 ...

  4. 编程算法 - 求1+2+...+n(函数继承) 代码(C++)

    求1+2+...+n(函数继承) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\whi ...

  5. FFmpeg总结(三)AV系列结构体之AVCodecContext

    位置: 描写叙述:主要扩展API的结构体 New fields can be added to the end with minor version bumps. Removal, reorderin ...

  6. J2EE肌肉系统—四层模型

    J2EE是基于JAVA技术的一种标准.为什么会有这种标准呢? 主要是在企业级应用开发其中有一些需求.比如数据库连接,邮件服务.事件处理等,都是一些通用模块. 而这些模块假设由开发者来开发.势必添加开发 ...

  7. HDU 1421 搬寝室 (线性dp 贪心预处理)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  8. YES,IT IS

  9. P3178 [HAOI2015]树上操作 树链剖分

    这个题就是一道树链剖分的裸题,但是需要有一个魔性操作___编号数组需要开longlong!!!震惊!真的神奇. 题干: 题目描述 有一棵点数为 N 的树,以点 为根,且树点有边权.然后有 M 个操作, ...

  10. (函数即服务)Faas的现状与未来

    刚看到jolestar一位从法律转行程序员的前辈写了一篇Faas现状与未来的文章,里面很多观点都很有启发,或许正如他说的那样,由于Faas能较好的解决资源利用率和开发效率问题,2018年Faas将变得 ...