BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)
题目大意:给你一个无向联通图,节点数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)的更多相关文章
- bzoj 1415 [Noi2005]聪聪和可可——其实无环的图上概率
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和“游走”一样.于是高斯消元.n^2状态,复杂度n^6…… 看看TJ,发现因为聪 ...
- 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), ...
- BZOJ 2318: Spoj4060 game with probability Problem( 概率dp )
概率dp... http://blog.csdn.net/Vmurder/article/details/46467899 ( from : [辗转山河弋流歌 by 空灰冰魂] ) 这个讲得很好 , ...
- 【BZOJ 3811】玛里苟斯 大力观察+期望概率dp+线性基
大力观察:I.从输出精准位数的约束来观察,一定会有猫腻,然后仔细想一想,就会发现输出的时候小数点后面不是.5就是没有 II.从最后答案小于2^63可以看出当k大于等于3的时候就可以直接搜索了 期望概率 ...
- BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)
2318: Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果 ...
- BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]
传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...
- bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索
期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...
- bzoj 1415: [Noi2005]聪聪和可可
直接上记忆化搜索 #include<queue> #include<cstdio> #include<algorithm> using namespace std; ...
- bzoj 1415: [Noi2005]聪聪和可可【期望dp+bfs】
因为边权为1所以a直接bfs瞎搞就行--我一开始竟然写了个spfa #include<iostream> #include<cstdio> #include<queue& ...
随机推荐
- POJ 1061 青蛙的约会( 拓欧经典题 )
链接:传送门 思路:简单拓展欧几里德,分析后可以得到方程 x + m * t = y + n * t + L * s( s控制圈数,t代表跳t次会碰面 ),经过化简可以得到 ( n - m ) * t ...
- 64 求1+2+3+...+n(发散思维能力 )
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 解题思路: 1)利用&&的短 ...
- UVA455 - Periodic Strings(紫书习题3.4)
如果一个字符串可以被某个长度为k的字符串重复多次得到,则称这个字符串的周期为k.例如,字符串"abcabcabcabc"以3为周期(当然,他也以6.12等等为周期). 现在请你编 ...
- 02.OOP面向对象-2.例子
class clothes: #初始化属性 def __init__(self,name,color): self.name = name self.color = color #转字符串 def _ ...
- 朴素贝叶斯(Naive Bayesian)
简介 Naive Bayesian算法 也叫朴素贝叶斯算法(或者称为傻瓜式贝叶斯分类) 朴素(傻瓜):特征条件独立假设 贝叶斯:基于贝叶斯定理 这个算法确实十分朴素(傻瓜),属于监督学习,它是一个常用 ...
- ajax提交数据遇到400异常,原因及解决方案
开发中遇到的问题, ajax的URL写的正确但是确无法正常跳转, 开发者模式下显示请求400异常. 前后台代码如下 ------------------------------------------ ...
- Makefile错误总结
自己在做嵌入式驱动时,编写makefile文件是犯的错及解决办法 问题1:makefile 3 missing separator.stop: 问题2:Nothing to be done for ' ...
- HDU 4268 Alice and Bob(贪心+Multiset的应用)
题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形能够覆盖还有一个矩形的条件的是,本身长度大于等于还有一个矩形,且宽度大于等于还有一个矩形.矩形不可旋转.问你Alice最多能覆盖Bo ...
- OC第三天(内存管理)
内存管理: 1.作用范围: 不论什么继承了NSObject的对象,堆基本数据类型无效如:int a ,float price;;等 2.原理: 每一个对象内部都保存了一个与之相关的整数,称为引用计数器 ...
- 学艺不精而惭愧--论C++模板类的使用
自己断断续续地使用C++也有一段时间了.有些时候产生了自满的情绪.觉得自己对C++的语言特性已经知道的几乎相同了,在语法方面没有什么难倒我的地方了,如今所要做的是依据实际问题编敲代码,问题的难点在于算 ...