题目大意:给你一个无向联通图,节点数n<=1000。聪聪有一个机器人从C点出发向在M点的可可移动,去追赶并吃掉可可,在单位时间内,机器人会先朝离可可最近的节点移动1步,如果移动一步机器人并不能吃掉可可,那机器人会再向可可的方向移动一格,如果有两个节点到可可的距离相等,那机器人会移动到编号较小的一个节点。然后可可会等可能性移动到与它的任意一个相连的节点或者原地不动(即使她明知道移动到某个节点会被吃掉)。即1/(outc[x]+1),outc为出度。求可可被吃掉时机器人走的期望时间

概率DP记忆化+递归

先预处理出任意两点距离

接下来递归求答案,记录一个f[x][y]表示可可在x节点,机器人在y节点时,可可被吃掉的期望时间,x,y这种局面可能出现多次,由不同的前驱状态到达x,y这种状态,所以乘上前驱状态转移到当前状态的概率,就是这个情况对前驱状态答案的贡献。

对于每种状态,答案都是,prob是前驱状态转移到当前状态的的概率

时间是

 #include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010
#define mod 20100403
#define p(i,j) ((i-1)*m+j)
#define dd double
using namespace std; char str[N][N];
int n,m,s,e,cte;
int inc[N],ouc[N],d[N][N],head[N],use[N];
dd f[N][N];
struct Edge{int to,nxt;}edge[N*];
void ae(int u,int v){
++cte,edge[cte].to=v,inc[v]++,ouc[u]++;
edge[cte].nxt=head[u],head[u]=cte;
}
void bfs()
{
memset(d,0x3f,sizeof(d));
for(int i=;i<=n;i++)
{
d[i][i]=;
queue<int>q;
q.push(i),use[i]=;
memset(use,,sizeof(use));
while(!q.empty())
{
int x=q.front();q.pop();
for(int j=head[x];j!=-;j=edge[j].nxt){
int v=edge[j].to;
if(d[i][v]>d[i][x]+){
d[i][v]=d[i][x]+;
if(!use[v]) use[v]=,q.push(v);
}
}use[x]=;
}
}
}
dd dfs(int x,int y,dd pb)
{
int vx,to1,to2;
dd ans=1.0;
if(f[x][y]-0.000000001>) return f[x][y]*pb;
if(!d[x][y]) {f[x][y]=;return ;}
if(d[x][y]<=) {f[x][y]=1.0;return pb*1.0;}
to1=y;
for(int j=head[y];j!=-;j=edge[j].nxt){
int v=edge[j].to;
if(d[x][v]<d[x][to1]) to1=v;
else if(d[x][v]==d[x][to1]) to1=min(v,to1);
}
to2=to1;
for(int j=head[to1];j!=-;j=edge[j].nxt){
int v=edge[j].to;
if(d[x][v]<d[x][to2]) to2=v;
else if(d[x][v]==d[x][to2]) to2=min(v,to2);
}
for(int j=head[x];j!=-;j=edge[j].nxt){
vx=edge[j].to;
ans+=dfs(vx,to2,1.0/(1.0*ouc[x]+1.0));
}
ans+=dfs(x,to2,1.0/(1.0*ouc[x]+1.0));
f[x][y]=ans;
return ans*pb;
} int main()
{
scanf("%d%d%d%d",&n,&m,&s,&e);
int x,y;memset(head,-,sizeof(head));
for(int i=;i<=m;i++)
scanf("%d%d",&x,&y),
ae(x,y),ae(y,x);
bfs();
printf("%.3lf\n",dfs(e,s,1.0));
return ;
}

BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)的更多相关文章

  1. bzoj 1415 [Noi2005]聪聪和可可——其实无环的图上概率

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和“游走”一样.于是高斯消元.n^2状态,复杂度n^6…… 看看TJ,发现因为聪 ...

  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. BZOJ 2318: Spoj4060 game with probability Problem( 概率dp )

    概率dp... http://blog.csdn.net/Vmurder/article/details/46467899 ( from : [辗转山河弋流歌 by 空灰冰魂] ) 这个讲得很好 , ...

  4. 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基

    大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...

  5. BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)

    2318: Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果 ...

  6. BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]

    传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...

  7. bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索

    期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...

  8. bzoj 1415: [Noi2005]聪聪和可可

    直接上记忆化搜索 #include<queue> #include<cstdio> #include<algorithm> using namespace std; ...

  9. bzoj 1415: [Noi2005]聪聪和可可【期望dp+bfs】

    因为边权为1所以a直接bfs瞎搞就行--我一开始竟然写了个spfa #include<iostream> #include<cstdio> #include<queue& ...

随机推荐

  1. BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)

    题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...

  2. [洛谷 P2365] 任务安排 (线性dp)

    3月14日第二题!! 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间 ...

  3. [tyvj-2054][Nescafé29]四叶草魔杖 费用流

    lyd讲的最小生成树的题. 道理我都懂,费用流多好写,又好调.但和一般费用流不一样的就是它走过一次后费用需调成0,但是再等回流,就恢复原状即可. #include <queue> #inc ...

  4. django与mysql实现简单的增删查改

    模型定义 from django.db import models class Grades(models.Model): g_name = models.CharField(max_length=2 ...

  5. Git clone时出现Please make sure you have the correct access rights and the repository exists.问题已解决。

    看了好多资料终于搞定了git 中clone命令报错这个问题,废话不多说直接上步骤希望对大家有帮助. 1   删除.ssh文件夹(直接搜索该文件夹)下的known_hosts(手动删除即可,不需要git ...

  6. ORA-12560: TNS: 协议适配器错误(oracle service 已启动)

    如果是安装完 oracle 客户端之后才出现的这个问题,请往下看 安装 oracle client 时,会配置一个客户端的监听,如果电脑上之前安装过 oracle service 就会和服务的监听冲突 ...

  7. python 中的一些小命令

  8. 关于sql连接查询(内联、左联、右联、全联)

    内连接(INNER JOIN)(典型的连接运算,使用像   =   或   <>   之类的比较运算符).包括相等连接和自然连接. 内连接使用比较运算符根据每个表共有的列的值匹配两个表中的 ...

  9. [Linux]第五部分-Linux系统管理员

    启动流程如下:1.加载BIOS信息,读取第一个启动设备代号2.读取第一个启动设备的Mbr引导程序的启动信息3.加载操作系统核心信息4.核心执行init程序并获取运行信息5.init执行 /etc/rc ...

  10. [Beginning SharePoint Designer 2010]列表和库&内部内容类型

    本章概要: 1.SPS如何组织管理数据 2.如何创建列表和文档库 3.如何使用视图来过滤分类,分组列表和库 4.如何创建内容类型来应用一个定义好的结构到数据和文档中