bzoj 1415
莫名互测题...
这题一看就是期望dp,可是不会转移,所以考试写50分暴力走人...
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct Edge
{
int next;
int to;
}edge[2005];
int head[1005];
int dis[1005][1005];
bool used[1005];
int cnt=1;
int n,m;
int p0,p1;
void init()
{
memset(head,-1,sizeof(head));
cnt=1;
}
void add(int l,int r)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
head[l]=cnt++;
}
void spfa(int rt)
{
queue <int> M;
memset(dis[rt],0x3f,sizeof(dis[rt]));
memset(used,0,sizeof(used));
dis[rt][rt]=0;
used[rt]=1;
M.push(rt);
while(!M.empty())
{
int u=M.front();
M.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(dis[rt][to]>dis[rt][u]+1)
{
dis[rt][to]=dis[rt][u]+1;
if(!used[to])
{
used[to]=1;
M.push(to);
}
}
}
}
}
double ans=0;
void dfs(double p,int v,int pr,int pz)
{
if(pr==pz)
{
ans+=(double)v*p;
return;
}
int maxp=0;
int temp=0x3f3f3f3f;
for(int i=head[pr];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(dis[to][pz]<temp)
{
temp=dis[to][pz];
maxp=to;
}else if(dis[to][pz]==temp)
{
maxp=min(maxp,to);
}
}
pr=maxp;
if(pr==pz)
{
ans+=(double)v*p;
return;
}
maxp=0;
temp=0x3f3f3f3f;
for(int i=head[pr];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(dis[to][pz]<temp)
{
temp=dis[to][pz];
maxp=to;
}else if(dis[to][pz]==temp)
{
maxp=min(maxp,to);
}
}
pr=maxp;
if(pr==pz)
{
ans+=(double)v*p;
return;
}
int cot=0;
for(int i=head[pz];i!=-1;i=edge[i].next)
{
cot++;
}
cot++;
for(int i=head[pz];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(to==pr)
{
ans+=(double)p*(double)1.0/(double)cot*(double)v;
continue;
}
dfs(p*(double)1.0/(double)cot,v+1,pr,to);
}
dfs(p*(double)1.0/(double)cot,v+1,pr,pz);
}
int main()
{
// freopen("eat.in","r",stdin);
// freopen("eat.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%d%d",&p0,&p1);
if(p0==p1)
{
printf("0\n");
return 0;
}
init();
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++)
{
spfa(i);
}
dfs(1,1,p0,p1);
printf("%.3lf\n",ans);
return 0;
}
正解:期望dp+记忆华搜索
设状态f[i][j]代表聪聪在i点,可可在j点时聪聪追上可可的期望
然后用dfs更新即可,注意先预处理出最短路和tpos[i][j]表示聪聪在i点,可可在j点时聪聪走一步时会走到的位置
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct Edge
{
int next;
int to;
}edge[2005];
int head[1005];
int cnt=1;
int dis[1005][1005];
int tpos[1005][1005];
double f[1005][1005];
bool used[1005];
int inr[1005];
int n,m,p0,p1;
void add(int l,int r)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
head[l]=cnt++;
}
void bfs(int rt)
{
queue <int> M;
memset(used,0,sizeof(used));
memset(dis[rt],0x3f,sizeof(dis[rt]));
M.push(rt);
dis[rt][rt]=0;
used[rt]=1;
while(!M.empty())
{
int u=M.front();
M.pop();
for(int i=head[u];i;i=edge[i].next)
{
int to=edge[i].to;
if(used[to])
{
continue;
}
used[to]=1;
dis[rt][to]=dis[rt][u]+1;
M.push(to);
}
}
}
double dfs(int pr,int pz)
{
if(f[pr][pz]!=-1.0)
{
return f[pr][pz];
}
if(pr==pz)
{
return f[pr][pz]=0.0;
}
if(tpos[pr][pz]==pz)
{
return f[pr][pz]=1.0;
}
if(tpos[tpos[pr][pz]][pz]==pz)
{
return f[pr][pz]=1.0;
}
f[pr][pz]=0.0;
for(int i=head[pz];i;i=edge[i].next)
{
int to=edge[i].to;
f[pr][pz]+=dfs(tpos[tpos[pr][pz]][pz],to);
}
f[pr][pz]=(f[pr][pz]+dfs(tpos[tpos[pr][pz]][pz],pz))/(double)inr[pz]+1;
return f[pr][pz];
}
inline int read()
{
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
// freopen("eat.in","r",stdin);
// freopen("eat.out","w",stdout);
n=read(),m=read();
p0=read(),p1=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y);
add(y,x);
inr[x]++;
inr[y]++;
}
for(int i=1;i<=n;i++)
{
inr[i]++;
bfs(i);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=-1.0;
int temp=0x3f3f3f3f;
for(int k=head[i];k;k=edge[k].next)
{
int to=edge[k].to;
if(dis[to][j]<temp)
{
tpos[i][j]=to;
temp=dis[to][j];
}else if(dis[to][j]==temp)
{
tpos[i][j]=min(tpos[i][j],to);
}
}
}
}
printf("%.3lf\n",dfs(p0,p1));
return 0;
}
bzoj 1415的更多相关文章
- BZOJ 1415 聪聪和可可(概率DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1415 题意:一个无向图,一个猫.一只老鼠.在任意时刻猫知道老鼠在哪个顶点上.每次移动猫先 ...
- 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】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)
1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1640 Solved: 962 Description I ...
- bzoj 1415(概率dp和bfs预处理)
感觉挺经典的一道题目. 先用 bfs 预处理下一步走到的位置.因为每一步走法都是固定的,所以可以用dp的方法来做. 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec M ...
- bzoj 1415 [Noi2005]聪聪和可可——其实无环的图上概率
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和“游走”一样.于是高斯消元.n^2状态,复杂度n^6…… 看看TJ,发现因为聪 ...
- BZOJ 1415 【NOI2005】 聪聪和可可
题目链接:聪聪和可可 一道水题--开始还看错题了,以为边带权--强行\(O(n^3)\)预处理-- 首先,我们显然可以预处理出一个数组\(p[u][v]\)表示可可在点\(u\),聪聪在点\(v\)的 ...
- bzoj 1415 期望+记忆化搜索 ****
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdkAAAIfCAIAAACzfDFhAAAgAElEQVR4nOy9bVwTW57vm5fnhed+Pn
- BZOJ 1415 聪聪和可可
f[i][j]表示i点追j点的期望步数... 这题必须spfa不能bfs. 且复杂度不会炸(仅1000条边) #include<iostream> #include<cstdio&g ...
- bzoj 1415: [Noi2005]聪聪和可可
直接上记忆化搜索 #include<queue> #include<cstdio> #include<algorithm> using namespace std; ...
- BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]
传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...
随机推荐
- Python 关于在ubuntu部署Django项目
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- mysql 案例 ~ 函数汇总
一 简介:通过perf分析活跃的mysql系统函数 二 函数简介 1 buf_calc_page_new_checksum 作用 确认页是否损坏 在buf_calc_page_new_checksu ...
- python使用PDB进行调试
参考链接:https://www.cnblogs.com/xiaohai2003ly/p/8529472.html 调入包:import pdb 调试时的一些命令: (1)p 变量名:查看变量:(p ...
- 关于python中的矩阵乘法(array和mat类型)
关于python中的矩阵乘法,我们一般有两种数据格式可以实现:np.array()类型和np.mat()类型: 对于这两种数据类型均有三种操作方式: (1)乘号 * (2)np.dot() (3)np ...
- Django:前后端分离后联调给前端传数据
实现前后端分离后,有了下面几点改变: 1.服务器一分为二,前后端分别部署,静态资源放在前端服务器,业务代码放在后的服务器 2.前端服务器需要接收Http请求(一般使用node.js) 3.前端服务器需 ...
- PHP操作MongoDB 数据库
最近有个项目,需要用php操作mongoDb数据,整理如下 1,连接MongoDB数据库 $conn = new Mongo(); 其他链接方式 //$conn=new Mongo(); #连接本地主 ...
- 【转】Java finally语句到底是在return之前还是之后执行?
网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验,至少有两种情况下final ...
- struts2框架学习之第一天
day01 Struts2概述 1 什么是框架 试想一下,人与人之间不同之处多,还是相同之处多呢?当然是相同之处多,不同之处少!人都有头,而且头都在脖子上面! 软件之间也是相同之处多,不同之处少,框架 ...
- FHQ Treap摘要
原理 以随机数维护平衡,使树高期望为logn级别 不依靠旋转,只有两个核心操作merge(合并)和split(拆分) 因此可持久化 先介绍变量 ; int n; struct Node { int v ...
- InnoDB 与 MYISAM的区别和联系
1.存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...