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& ...
随机推荐
- BZOJ 3158 千钧一发 (最大流->二分图带权最大独立集)
题面:BZOJ传送门 和方格取数问题很像啊 但这道题不能像网格那样黑白染色构造二分图,所以考虑拆点建出二分图 我们容易找出数之间的互斥关系,在不能同时选的两个点之间连一条流量为$inf$的边 由于我们 ...
- [luogu3203 HNOI2010] 弹飞绵羊 (分块)
传送门 Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...
- win10 1809磁盘占用总是100%
快过年了,提前请假回家,装几台电脑公司备用.有个电脑装完系统开机很慢,开机完成之后电脑响应也很慢,于是打开任务管理器发现磁盘中用率一直是100%,然而程序读取数据的速度并不高. 解决思路: 关闭win ...
- Python GitHub上星星数量最多的项目
GitHub上星星数量最多的项目 """ most_popular.py 查看GitHub上获得星星最多的项目都是用什么语言写的 """ i ...
- python中的and、or 操作符
在python中 非空 非零的数都为真 1. 其"and"操作符返回的结果是决定表达式结果的值:两边条件都为真则结果为真,有一假则为假 1) 当and两边条件为“真”时,返回的是a ...
- Python包结构和函数式编程
# 包的结构 |--包 |--|-- __init__.py 包的标志文件 |--|-- 模块1 |--|-- 模块2 |--|-- 子包(子文件夹) |--|--|-- __init__.py 包的 ...
- SpringMVC在对应绑定不同实体,但具有相同属性名的解决方案....
在springmvc中,可以对前台传递过来的参数进行与后台实体绑定(第二种方式相对较好). 比如: 前台页面: <form action="${pageContext.request. ...
- Ubuntu中的Docker搭建Tensorflow环境
一.docker环境安装 1)更新.安装依赖包 sudo apt-get update sudo apt-get install apt-transport-https ca-certificates ...
- ZOJ 3885 The Exchange of Items
The Exchange of Items Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. O ...
- BA-强强联手江森自控携手日立空调(转载)
文章出处:http://www.aircon.com.cn 2014年1月6日 艾肯空调制冷网 江森真是非常擅长资本运作,也对技术前沿定义的很明白,快速获得技术靠资本也考内力,内化后就开始市场 ...