HYSBZ 1415 - 聪聪和可可

http://vjudge.net/problem/viewProblem.action?id=20613

题意:不用说了,中文题。

这个题可以用概率DP来做。

题中要求猫抓到老鼠的时间期望。分析一下这个过程,如果猫在每单位时间里第一步移动没有抓到老鼠,它还可以继续移动一次。对于确定老鼠的位置,注意猫的每次移动都是固定的,而老鼠的移动位置却是不定的。

令dp[i][j]表示猫在i位置老鼠在j位置时,猫抓到老鼠的期望。next[i][j]表示猫从i位置到j位置时走最短路径需要移动到的第一个结点位置。d[i]表示结点i的度。

这样首先看猫的当前位置,如果i==j即猫和老鼠在同一个点,那么猫不用移动了这时候猫已经抓到了老师,dp[i][j]=0。

如果不等,考虑如果猫在这两次移动中抓到了老鼠,如果猫第一步移动到了老鼠当前所在位置,即next[i][j]==j,或者猫第二步移动抓到了老鼠,即next[next[i][j]][j]==j,此时所用时间都是1,dp[i][j]=1。

其他情况,考虑猫在该单位时间内没抓到老鼠,此时的状态转移取决于老鼠的行动。老鼠可以移动到任意一个和j结点相连的点,也可以停留在j点,每种情况发生的概率是1/(d[j]+1),每次转移到的状态即dp[next[next[i][j]][j]][k](k取值j,或与j点直接连边的点),运用全期望公式即可。

这样记忆化搜索可解。

其中计算next[][]的过程可以用bfs预处理。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
#define MAXN 30005
using namespace std;
int n,m;
vector<int> gl[1005];
bool vis[1005][1005];
double f[1005][1005];
int next[1005][1005];
struct Point
{
int pos,from;
Point(int a=0,int b=0):pos(a),from(b) {}
};
void bfs(int sst)
{
bool vis[1005]= {0};
queue<Point> que;
que.push(Point(sst));
while(!que.empty())
{
Point q=que.front();
que.pop();
for(int i=0; i<gl[q.pos].size(); ++i)
{
if(vis[gl[q.pos][i]]) continue;
vis[gl[q.pos][i]]=true;
int f;
if(q.pos==sst) f=gl[q.pos][i];
else f=q.from;
que.push(Point(gl[q.pos][i],f));
next[sst][gl[q.pos][i]]=f;
}
}
}
double dp(int i,int j)
{
if(vis[i][j]) return f[i][j];
vis[i][j]=true;
int &p=next[i][j];
if(i==j) return f[i][j]=0;
if(p==j||next[p][j]==j) return f[i][j]=1;
f[i][j]=0;
for(int k=0; k<gl[j].size(); ++k)
f[i][j]+=dp(next[p][j],gl[j][k]);
f[i][j]+=dp(next[p][j],j);
f[i][j]/=(gl[j].size()+1);
f[i][j]++;
return f[i][j];

}
int main()
{
scanf("%d%d",&n,&m);
int st,ed;
scanf("%d%d",&st,&ed);
for(int i=0; i<m; ++i)
{
int x,y;
scanf("%d%d",&x,&y);
gl[x].push_back(y);
gl[y].push_back(x);
}
for(int i=1; i<=n; ++i)
{
sort(gl[i].begin(),gl[i].end());
bfs(i);
}
memset(vis,0,sizeof(vis));
printf("%.3lf\n",dp(st,ed));
return 0;
}

HYSBZ 1415 - 聪聪和可可

时间: 2024-11-01 22:43:59

HYSBZ 1415 - 聪聪和可可的相关文章

聪聪和可可 HYSBZ - 1415(概率 + spfa + 记忆化dp)

Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A. 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连. Output 输出1个实数,四舍五入保留三位小数,表示平均多少个时

【BZOJ】【1415】【NOI2005】聪聪和可可

数学期望+记忆化搜索 论文:<浅析竞赛中一类数学期望问题的解决方法>——汤可因  中的第一题…… Orz 黄学长 我实在是太弱,这么简单都yy不出来…… 宽搜预处理有点spfa的感觉= =凡是更新了的,都要重新入队更新一遍…… dp的记忆化搜索过程好厉害…… 期望这里一直很虚啊,赶紧再多做点题熟悉熟悉…… 1 /************************************************************** 2 Problem: 1415 3 User: Tunix

【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路. 所有的路都是无向的,即

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

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和"游走"一样.于是高斯消元.n^2状态,复杂度n^6-- 看看TJ,发现因为聪聪不是随便走的,所以聪聪一直逼近可可.故其实无环.可以记搜. (1A还是不错的) #include<iostream> #include<cstdio> #include<cstring> #include<queue> using name

BZOJ 1415 NOI2005 聪聪和可可 期望DP+记忆化搜索 BZOJ200题达成&amp;&amp;NOI2005全AC达成

题目大意:给定一个无向图,聪聪在起点,可可在终点,每个时刻聪聪会沿最短路走向可可两步(如果有多条最短路走编号最小的点),然后可可会等概率向周围走或不动,求平均多少个时刻后聪聪和可可相遇 今天早上起床发现194了然后就各种刷--当我发现199的时候我决定把第200题交给05年NOI仅剩的一道题--结果尼玛调了能有一个小时--我居然没看到编号最小这个限制0.0 首先我们知道,由于聪聪走两步而可可走一步,所以聪聪一定能在有限的时刻追上可可,而且两人的距离随着时间进行单调递减 于是我们记忆化搜索 首先用

BZOJ 1415 【NOI2005】 聪聪和可可

题目链接:聪聪和可可 一道水题--开始还看错题了,以为边带权--强行\( O(n^3)\)预处理-- 首先,我们显然可以预处理出一个数组\( p[u][v] \)表示可可在点\(u\),聪聪在点\(v\)的时候聪聪下一步会往哪里走.然后--一个记忆化搜索就轻易地解决掉了-- 至于转移方程吗,我觉得也没有必要写了--你要是实在不知道就看一看代码吧-- 下面贴代码: #include<iostream> #include<cstdio> #include<cstring>

【BZOJ】1415 [Noi2005]聪聪和可可

[算法]期望DP,记忆化搜索 题目 [题解]浅析竞赛中一类数学期望问题的解决方法 例题 首先因为聪聪走的步数等于大于可可走的步数,所以不可能出现循环(高斯消元),使DP成为可能. 因为是图显然采用记忆化搜索. p[x][y]表示x走向y第一步编号,f[x][y]表示答案(把答案数组设置出来考虑倒序递推就顺理成章了). e[x][y]表示x的相邻点(代码实现用邻接表),t[x]表示x的度(邻点个数). if(x==y)f[x][y]=0; if(p[p[x][y]][y]==y||p[x][y]=

bzoj1415【NOI2005】聪聪和可可

1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1271  Solved: 748 [Submit][Status][Discuss] Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景

[BZOJ 2152]聪聪可可

Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树).并且每条“边”上都有一个数.接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所