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& ...
随机推荐
- JSplitPane按比例分割的问题
JSplitPane看似比Delphi的spliter难用许多.不过介于swing可以方便的使用记事本一类文本编辑器直接书写依据布局的界面代码我们还是姑且容忍它带来的不便.但在使用JSplitPane ...
- Zepto.js 源码解析(emoji版)
graph LR A($) --- B(function) A($) --- C(zepto) A($) --- D(fn) C(zepto) --- CA(init) C(zepto) --- CB ...
- PHP算法之判断是否是质数
质数的定义 质数又称素数.一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数:否则称为合数. 实现思路 循环所有可能的备选数字,然后和中间数以下且大于等于2的整数进行整除比较,如果能 ...
- prim求最小生成树
一直以来只会Kruskal prim和dijkstra很像 只不过prim维护的是最短的边,而dijkstra维护的是最短的从起点到一个点的路径 同时prim要注意当前拓展的边是没有拓展过的 可以用堆 ...
- C++ constexpr类型说明符
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50864210 关键字 constexp ...
- Storm同时接收多个源(spout和bolt)
参考: http://blog.csdn.net/nyistzp/article/details/51483779
- SSH学习之中的一个 OpenSSH基本使用
在Linux系统中.OpenSSH是眼下最流行的远程系统登录与文件传输应用,也是传统Telenet.FTP和R系列等网络应用的换代产品. 当中,ssh(Secure Shell)能够替代telnet. ...
- 上机题目(中级)- 两个超级大的整数相加相减 (Java)
代码例如以下: public class AddSub { public static void main(String[] args) { String a="46328648326846 ...
- HDU 2181 DFS
Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每一个城市刚好一次后回到出发的城市. Input 前20行的第i行有3 ...
- JSP页面标签
1.EL表达式中empty的用法 EL表达式中empty的用法 <c:if test="${! empty key}">${key}</c:if> < ...