BZOJ 1415 聪聪和可可(概率DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1415
题意:一个无向图,一个猫、一只老鼠。在任意时刻猫知道老鼠在哪个顶点上。每次移动猫先。猫每次向靠近老鼠的顶点移动。若没有到达老鼠所在顶点,则接着再移动一次(即便是两次也是用的一个时间单位);然后老鼠移动;老鼠每次向周围的顶点移动或者呆在原地不动,概率相同。猫和老鼠在一个顶点上则吃掉老鼠。求吃掉老鼠的时间期望。
思路:设f[i][j][0]表示猫在i、老鼠在j、轮到猫移动的期望;f[i][j][1]表示轮到老鼠移动的期望。则对于固定的i和j,轮到猫移动时,下一次猫移动到的顶点是固定的,设为s,则f[i][j][0]=f[s][j][1]+1;对于老鼠,设与其相邻顶点集合为S,大小为num,则f[i][j][1]=(sum(f[i][Sk][0])+f[i][j][0])/(num+1)。一开始我担心会出现兜圈子的情况,就是老鼠在转,猫跟着转,这样就麻烦了,貌似需要列方程求解。但是分析一下不会出现这种情况,因为猫每次移动两个,老鼠最多移动一个,猫总能撵上老鼠的。。
vector<int> g[N];
int dis[N][N],p[N][N];
double f[N][N][2];
int n,m,S,T;
void SPFA(int u,int dis[])
{
int i;
FOR1(i,n) dis[i]=INF;
dis[u]=0;
queue<int> Q;
Q.push(u);
int visit[N]={0};
visit[u]=1;
int v;
while(!Q.empty())
{
u=Q.front();
Q.pop();
visit[u]=0;
FOR0(i,SZ(g[u]))
{
v=g[u][i];
if(dis[v]>dis[u]+1)
{
dis[v]=dis[u]+1;
if(!visit[v]) Q.push(v),visit[v]=1;
}
}
}
}
int cal(int u,int v)
{
if(u==v) return u;
int i,x,Min=INF,k;
FOR0(i,SZ(g[u]))
{
x=g[u][i];
if(dis[v][x]<Min||dis[v][x]==Min&&x<k) Min=dis[v][x],k=x;
}
if(k==v) return k;
Min=INF;
FOR0(i,SZ(g[k]))
{
x=g[k][i];
if(dis[v][x]<Min||dis[v][x]==Min&&x<u) Min=dis[v][x],u=x;
}
return u;
}
void init()
{
int i,j;
FOR1(i,n) SPFA(i,dis[i]);
FOR1(i,n) FOR1(j,n) p[i][j]=cal(i,j);
}
double DFS(int u,int v,int t)
{
if(u==v) return 0;
if(f[u][v][t]>-1) return f[u][v][t];
int i,x;
if(t==0) f[u][v][t]=DFS(p[u][v],v,1)+1;
else
{
f[u][v][t]=0;
FOR0(i,SZ(g[v]))
{
x=g[v][i];
f[u][v][t]+=DFS(u,x,0);
}
f[u][v][t]+=DFS(u,v,0);
f[u][v][t]/=SZ(g[v])+1;
}
return f[u][v][t];
}
int main()
{
RD(n,m); RD(S,T);
int i,x,y;
FOR1(i,m)
{
RD(x,y);
g[x].pb(y);
g[y].pb(x);
}
init();
clr(f,-1);
PR(DFS(S,T,0));
}
BZOJ 1415 聪聪和可可(概率DP)的更多相关文章
- BZOJ 1415 [NOI2005]聪聪与可可 (概率DP+dfs)
题目大意:给你一个无向联通图,节点数n<=1000.聪聪有一个机器人从C点出发向在M点的可可移动,去追赶并吃掉可可,在单位时间内,机器人会先朝离可可最近的节点移动1步,如果移动一步机器人并不能吃 ...
- 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 1415 [Noi2005]聪聪和可可——其实无环的图上概率
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和“游走”一样.于是高斯消元.n^2状态,复杂度n^6…… 看看TJ,发现因为聪 ...
- 【BZOJ 1419】Red is good [概率DP]
我 是 Z Z 概率好玄啊(好吧是我太弱.jpg Description 桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元.可以随时停止翻 ...
- BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]
传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...
- bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索
期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...
- bzoj 1415: [Noi2005]聪聪和可可【期望dp+bfs】
因为边权为1所以a直接bfs瞎搞就行--我一开始竟然写了个spfa #include<iostream> #include<cstdio> #include<queue& ...
- bzoj 1415: [Noi2005]聪聪和可可
直接上记忆化搜索 #include<queue> #include<cstdio> #include<algorithm> using namespace std; ...
- BZOJ 1415: [Noi2005]聪聪和可可(记忆化搜索+期望)
传送门 解题思路 还是比较简答的一道题.首先\(bfs\)把每个点到其他点的最短路求出来,然后再记忆化搜索.记搜的时候猫的走法是确定的,搜一下老鼠走法就行了. 代码 #include<iostr ...
- BZOJ 1246 & 有点不一样的概率DP
题意: 题意够坑的啊... 一个色子有n个面,第k次掷出一个加上这个k.求掷出所有面的期望值. 我一直以为值是色子面上的... 那么问题来了在色子面上怎么做...n还是1w级别... SOL: 对着理 ...
随机推荐
- bzoj 3142 数学
找规律后可以之后答案就是 k^(m-1)*(n-(m-1)*k)+(m+(m-1)*k+1)*k^(m-1) div 2 /************************************** ...
- hdu 3061 Battle 最大权闭合图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3061 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅.而他上任的第一天,就面对了一场极其困难的 ...
- 【BZOJ】【3210】花神的浇花集会
曼哈顿距离与切比雪夫距离 QAQ蒟蒻并不知道切比雪夫距离是什么……并不会做这道题…… 去膜拜了PoPoQQQ大爷的题解: 题目大意:给定平面上的n个点,求一个点到这n个点的切比雪夫距离之和最小 与31 ...
- 【BZOJ】【1024】【SCOI2009】生日快乐
枚举 想到以后一秒钟变水题…… 一开始我想:这不是可以随便切吗……但是突然想到:第一刀,必须切在n等分点上!因为要求最后每块的大小相等,那么同理,比如总共要切成7块,第一刀切成了$\frac{3}{7 ...
- 【CodeForces】【321E】Ciel and Gondolas
DP优化/四边形不等式 这题……跟邮局那题简直一模一样吧……好水的E题…… 设dp[i][j]表示前 i 艘“gondola”坐了前 j 个人,那么方程即为$dp(i,j)=min\{ dp[i-1] ...
- Leetcode#126 Word Ladder II
原题地址 既然是求最短路径,可以考虑动归或广搜.这道题对字典直接进行动归是不现实的,因为字典里的单词非常多.只能选择广搜了. 思路也非常直观,从start或end开始,不断加入所有可到达的单词,直到最 ...
- BZOJ 3155: Preprefix sum
大意:给一个数组,先求出SUM[I],然后动态的求出1-I的SUM[I]的和, 这题得化公式: 树状数组维护两个和:SUM(A[I])(1<=I<=X); SUM(A[I]*(N-I+1) ...
- java多线程基础知识
1.ThrTest.java 继承Thread类方式 public class ThrTest extends Thread { private String name; public ThrTest ...
- Android 中多点触摸协议
http://blog.csdn.net/zuosifengli/article/details/7398661 Android 中多点触摸协议: 参考: http://www.kernel.org/ ...
- Libevent详细说明
文章来自官方文档的部分翻译:http://www.wangafu.net/~nickm/libevent-book/ 通过这部分的了解,基本上可以使用libevent的常用功能了.有时间建议直接看官方 ...