★★   输入文件:cchkk.in   输出文件:cchkk.out   简单对比
                      时间限制:1 s   内存限制:256 MB

【问题描述】

在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可。虽然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠,同样不变的是,聪聪成天想着要吃掉可可。

一天,聪聪意外得到了一台非常有用的机器,据说是叫GPS,对可可能准确的定位。有了这台机器,聪聪要吃可可就易如反掌了。于是,聪聪准备 马上出发,去找可可。而可怜的可可还不知道大难即将临头,仍在森林里无忧无虑的玩耍。小兔子乖乖听到这件事,马上向灰姑娘报告。灰姑娘决定尽快阻止聪聪, 拯救可可,可她不知道还有没有足够的时间。

整个森林可以认为是一个无向图,图中有N个美丽的景点,景点从1至N编号。小动物们都只在景点休息、玩耍。在景点之间有一些路连接。

当聪聪得到GPS时,可可正在景点M(M≤N)处。以后的每个时间单位,可可都会选择去相邻的景点(可能有多个)中的一个或停留在原景点不 动。而去这些地方所发生的概率是相等的。假设有P个景点与景点M相邻,它们分别是景点R、景点S,……景点Q,在时刻T可可处在景点M,则在(T+1)时 刻,可可有1/(P+1)的可能在景点R,有1/(P+1)的可能在景点S,……,有1/(P+1)的可能在景点Q,还有1/(P+1)的可能停在景点 M。

我们知道,聪聪是很聪明的,所以,当她在景点C时,她会选一个更靠近可可的景点,如果这样的景点有多个,她会选一个标号最小的景点。由于聪聪太想吃掉可可了,如果走完第一步以后仍然没吃到可可,她还可以在本段时间内再向可可走近一步。

在每个时间单位,假设聪聪先走,可可后走。在某一时刻,若聪聪和可可位于同一个景点,则可怜的可可就被吃掉了。灰姑娘想知道,平均情况下,聪聪几步就可能吃到可可。而你需要帮助灰姑娘尽快的找到答案。

【输入文件】

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

【输出文件】

  • 输出到文件中。
  • 输出1个实数,四舍五入保留三位小数,表示平均多少个时间单位后聪聪会把可可吃掉。

【样例输入1】

4 3
1 4
1 2
2 3
3 4

【样例输出1】

1.500

【样例说明1】

开始时,聪聪和可可分别在景点1和景点4。

第一个时刻,聪聪先走,她向更靠近可可(景点4)的景点走动,走到景点2,然后走到景点3;假定忽略走路所花时间。

可可后走,有两种可能:

第一种是走到景点3,这样聪聪和可可到达同一个景点,可可被吃掉,步数为1,概率为 0.5。 第二种是停在景点4,不被吃掉。概率为 0.5。

到第二个时刻,聪聪向更靠近可可(景点4)的景点走动,只需要走一步即和可可在同一景点。因此这种情况下聪聪会在两步吃掉可可。

所以平均的步数是1* 0.5+2* 0.5=1.5步。

【样例输入2】

9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9

【样例输出2】

2.167

【样例说明2】

森林如下图所示:

【数据范围】

  • 对于所有的数据,1≤N,E≤980。
  • 对于50%的数据,1≤N≤50。

题解:

  聪聪每次可以走两步,可可可以走一步或者不走,聪聪先走,可可后走,聪聪朝向可可走,可可走向不同的方向概率是一样的。聪聪可以走两步的原因是:如果图是一个环,聪聪一步,可可一步,有一种情况是聪聪永远也吃不到可可,则期望步数比较难求,所以走两步是方便做题。

  我们设数组p[i][j]表示顶点i到顶点j的最短路上与顶点i相邻且编号最小的顶点编号,p数组可以用N遍SPFA算出,再令f[i][j]表示聪聪在i,可可在j,聪聪吃到可可的期望步数,显然f[i][j]是由f[p[p[i][j]][j]][to[j][k]]和f[p[p[i][j]][j]][j]转移过来,可以看出,f[i][j]是由上面两式+1得到的,所以最终的答案就是:

这个式子可以用dfs求出。

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn=;
int N,M,cong,ke;
double f[maxn][maxn];
int p[maxn][maxn],t[maxn];
int pre[maxn],dis[maxn];
bool vis[maxn];
vector<int> to[maxn];
inline void SPFA(int S){
static queue<int> Q;
while(!Q.empty()) Q.pop();
memset(vis,false,sizeof(vis)); memset(dis,,sizeof(dis)); memset(pre,,sizeof(pre));
Q.push(S); vis[S]=true; dis[S]=;
while(!Q.empty()){
int x=Q.front(); Q.pop();
for(int i=;i<to[x].size();i++){
int y=to[x][i];
if(vis[y]==false){
dis[y]=dis[x]+; vis[y]=true;
if(x==S) pre[y]=y;
else pre[y]=pre[x];
Q.push(y);
}
else if(dis[x]+<=dis[y]){
pre[y]=min(pre[y],pre[x]);
}
}
}
}
inline double dfs(int x,int y){
if(x==y) return ;
if(f[x][y]!=) return f[x][y];
double ans=dfs(p[p[x][y]][y],y);
for(int i=;i<to[y].size();i++){
int next=to[y][i];
ans+=dfs(p[p[x][y]][y],next);
}
ans/=(t[y]+); ans+=;
f[x][y]=ans;
return ans;
}
int main(){
//freopen("cchkk.in","r",stdin);
//freopen("cchkk.out","w",stdout);
scanf("%d%d%d%d",&N,&M,&cong,&ke);
for(int i=,u,v;i<=M;i++){
scanf("%d%d",&u,&v);
to[u].push_back(v); to[v].push_back(u);
t[u]++; t[v]++;
}
for(int i=;i<=N;i++){
SPFA(i);
for(int j=;j<=N;j++){
if(i!=j) p[i][j]=pre[j];
}
} for(int i=;i<=N;i++){
for(int j=;j<=N;j++){
if(i!=j&&(p[i][j]==j||p[p[i][j]][j]==j)) f[i][j]=;
}
}
printf("%.3lf\n",dfs(cong,ke)); return ;
}

最新文章

  1. C#开发EyeLink眼动仪的实验程序
  2. cf 730i
  3. 【转】当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
  4. react native get started run 模拟机报错解决
  5. memset()实现及细节
  6. IIS not allow PUT and DELETE method
  7. 使用cmake安装mysql5.5.13
  8. Activit各个网关使用简单介绍
  9. junit4初体验
  10. Vue.js依赖收集
  11. springboot 使用Filter
  12. requery.js使用姿势
  13. win10 开机背景图
  14. Svn 提示错误:previous operation has not finished 解决方案
  15. python center() 函数
  16. Netty高性能编程备忘录(上)
  17. arduino 串口命令解析
  18. XCode9的新变化
  19. 分享一个好用的dns
  20. hive mapjoin优化

热门文章

  1. Spark 源码分析 -- Task
  2. aliyun ECS da shang chuang 安装小结
  3. super()函数的用法
  4. python的os模块命令
  5. Appium+python移动端自动化测试-环境搭建(一)
  6. windows中的进程和线程
  7. Php 创建XML
  8. XTU1198:Candy(背包)
  9. 图解Python可以做些什么
  10. 0606-Zuul构建API Gateway-Zuul过滤器以及禁用Zuul过滤器