BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

Description

Input

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

Output

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

Sample Input

【输入样例1】
4 3
1 4
1 2
2 3
3 4
【输入样例2】
9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9

Sample Output

【输出样例1】
1.500
【输出样例2】
2.167


先求出dis[i][j]表示i和j之间的最短路,这步只需要对n个点进行bfs。

然后推出mov[i][j]表示聪聪在i点,可可在j点时聪聪再走一步会去几号点。

设F[i][j]表示聪聪在i点,可可在j点,聪聪吃到可可的期望步数。

因为聪聪一次走两步,可可每次走一步。

相当于每个回合聪聪都离可可进了一步。

于是DP转移是没有环的,直接记忆化搜索即可。

代码:

#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1050
#define inf 0x3f3f3f3f
typedef double f2;
f2 f[N][N];
int head[N],to[N<<1],nxt[N<<1],cnt,dis[N][N],n,m,S,T,Q[N],l,r,mov[N][N],out[N],vis[N];
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; out[u]++;
}
void bfs(int s) {
memset(vis,0,sizeof(vis)); l=r=0;
memset(dis[s],0x3f,sizeof(dis[s]));
Q[r++]=s;
while(l<r) {
int x=Q[l++],i; vis[x]=1;
for(i=head[x];i;i=nxt[i]) {
if(!vis[to[i]]) {
dis[s][to[i]]=dis[s][x]+1; vis[to[i]]=1;
Q[r++]=to[i];
}
}
}
}
f2 DP(int s,int t) {
if(f[s][t]!=-1) return f[s][t];
if(s==t) return f[s][t]=0;
f2 re=0;
int i,t1=mov[s][t],t2=mov[t1][t];
if(t1==t||t2==t) return 1;
for(i=head[t];i;i=nxt[i]) {
int y=to[i];
re+=DP(t2,y)+1;
}
re+=DP(t2,t)+1;
return f[s][t]=re/(out[t]+1);
}
int main() {
scanf("%d%d",&n,&m);
int i,x,y,j,k;
scanf("%d%d",&S,&T);
for(i=1;i<=m;i++) {
scanf("%d%d",&x,&y); add(x,y); add(y,x);
}
for(i=1;i<=n;i++) bfs(i);
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
f[i][j]=-1;
if(i!=j) {
for(k=head[i];k;k=nxt[k]) {
if(!mov[i][j]) mov[i][j]=to[k];
else if(dis[to[k]][j]<dis[mov[i][j]][j]||(dis[to[k]][j]==dis[mov[i][j]][j]&&to[k]<mov[i][j])) mov[i][j]=to[k];
}
}
}
}
printf("%.3f\n",DP(S,T));
}

BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs的更多相关文章

  1. BZOJ_3191_[JLOI2013]卡牌游戏_概率DP

    BZOJ_3191_[JLOI2013]卡牌游戏_概率DP Description   N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随 ...

  2. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  3. bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1415 noip2016 D1T3,多么痛的领悟...看来要恶补一下与期望相关的东西了. 这是 ...

  4. HYSBZ 1415 - 聪聪和可可(概率DP)

    http://vjudge.net/problem/viewProblem.action?id=20613 题意:不用说了,中文题. 这个题可以用概率DP来做. 题中要求猫抓到老鼠的时间期望.分析一下 ...

  5. luoguP4206 [NOI2005]聪聪与可可 期望概率DP

    首先,分析一下这个猫和鼠 猫每局都可以追老鼠一步或者两步,但是除了最后的一步,肯定走两步快些.... 既然猫走的步数总是比老鼠多,那么它们的距离在逐渐缩小(如果这题只能走一步反而不能做了...) 猫不 ...

  6. BZOJ 1415 聪聪和可可(概率DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1415 题意:一个无向图,一个猫.一只老鼠.在任意时刻猫知道老鼠在哪个顶点上.每次移动猫先 ...

  7. bzoj 1415: [Noi2005]聪聪和可可【期望dp+bfs】

    因为边权为1所以a直接bfs瞎搞就行--我一开始竟然写了个spfa #include<iostream> #include<cstdio> #include<queue& ...

  8. 【NOI2005】聪聪和可可 概率与期望 记忆化搜索

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 958[Submit][Statu ...

  9. 【BZOJ1415】 [Noi2005]聪聪和可可 概率与期望

    其实题不难,不知提交了几次...不能代码MD...注意一些基本问题...SB概率题 #include <iostream> #include <cstdio> #include ...

随机推荐

  1. UVA624 CD,01背包+打印路径,好题!

    624 - CD 题意:一段n分钟的路程,磁带里有m首歌,每首歌有一个时间,求最多能听多少分钟的歌,并求出是拿几首歌. 思路:如果是求时常,直接用01背包即可,但设计到打印路径这里就用一个二维数组标记 ...

  2. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  3. BZOJ1126: [POI2008]Uci

    $n \leq 100,m \leq 100$,$n*m$的01矩形,问从左下角开始往上走,每次转弯只能向右,不能经过重复点,不能撞到1,到达点$(x,y)$的方案数,$mod \ \ k$. 感人肺 ...

  4. React学习之State

    本文基于React v16.4.1 初学react,有理解不对的地方,欢迎批评指正^_^ 一.定义组件的两种方式 1.函数定义组件 function Welcome(props) { return & ...

  5. HDU 2050 【dp】【简单数学】

    题意: 中文. 思路: 不难发现数学规律是这样的,每次增加的划分区域的数量是每次增加的交点的数量再加一.然后就总结出了递推公式. #include<stdio.h> ]; int main ...

  6. Java获取Linux系统cpu使用率

    原文:http://www.open-open.com/code/view/1426152165201 import java.io.BufferedReader; import java.io.Fi ...

  7. Python中文GBK编码解决实例

    http://eatsalt.blog.163.com/blog/static/879402662009420508748/ #coding:gbk l=['我'.decode('gbk'),'我'. ...

  8. 【scrapy】Item及Spider

    Items Item objects are simple containers used to collect the scraped data.They provide a dictionary- ...

  9. 微信小程序之 Index(仿淘宝分类入口)

    1.逻辑层 index.js //index.js //获取应用实例 const app = getApp() Page({ /** * 页面的初始数据 */ data: { menu: { imgU ...

  10. [iOS] dom解析xml数据,拿到&lt;&gt;里面的值

    <response result="success" timestamp="1338890206" cityver="1.0"> ...