莫名互测题...

这题一看就是期望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的更多相关文章

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

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

  2. 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), ...

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

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description I ...

  4. bzoj 1415(概率dp和bfs预处理)

    感觉挺经典的一道题目. 先用 bfs 预处理下一步走到的位置.因为每一步走法都是固定的,所以可以用dp的方法来做. 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  M ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 乍一看和“游走”一样.于是高斯消元.n^2状态,复杂度n^6…… 看看TJ,发现因为聪 ...

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

    题目链接:聪聪和可可 一道水题--开始还看错题了,以为边带权--强行\(O(n^3)\)预处理-- 首先,我们显然可以预处理出一个数组\(p[u][v]\)表示可可在点\(u\),聪聪在点\(v\)的 ...

  7. bzoj 1415 期望+记忆化搜索 ****

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdkAAAIfCAIAAACzfDFhAAAgAElEQVR4nOy9bVwTW57vm5fnhed+Pn

  8. BZOJ 1415 聪聪和可可

    f[i][j]表示i点追j点的期望步数... 这题必须spfa不能bfs. 且复杂度不会炸(仅1000条边) #include<iostream> #include<cstdio&g ...

  9. bzoj 1415: [Noi2005]聪聪和可可

    直接上记忆化搜索 #include<queue> #include<cstdio> #include<algorithm> using namespace std; ...

  10. BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]

    传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...

随机推荐

  1. 关于tcp queue

    半连接队列:服务端维护的与客户端保持SYN_RECV状态的连接队列,等待客户端回复,当收到客户端ack后,如果条件允许(全连接队列未达到最大值),服务端进入ESTAB状态,从半连接队列移到全连接队列的 ...

  2. redis设置开机自启

    开机自启动redis(其他服务类似) centos 7以上是用Systemd进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvini ...

  3. Java线程实现的第三种方式Callable方式与结合Future获取返回值

    多线程的实现方式有实现Runnable接口和继承Thread类(实际上Thread类也实现了Runnable接口),但是Runnable接口的方式有两个弊端,第一个是不能获取返回结果,第二个是不能抛出 ...

  4. QR 编码原理(三)

    一.日本汉字(KANJI)是两个字节表示的字符码,编码的方式是将其转换为13字节的二进制码制. 转换步骤为: 1.对于JIS值为8140(hex) 到9FFC(hex)之间字符: a)将待转换的JIS ...

  5. [转] 一文弄懂神经网络中的反向传播法——BackPropagation

    在看CNN和RNN的相关算法TF实现,总感觉有些细枝末节理解不到位,浮在表面.那么就一点点扣细节吧. 这个作者讲方向传播也是没谁了,666- 原文地址:https://www.cnblogs.com/ ...

  6. 框架中的导航框架 & position定位

    框架中,通过链接将一个页面显示在另一个框架中:   总框架: <frameset cols="15%,*">   <frame src="xx.html ...

  7. 【Linux】时间同步设置+防火墙设置+SELinux设置

    时间同步设置 在大数据集群环境中,要求每台集群的时间必须是同步的,这样我们就会要求每台集群的时间必须和一台服务的时间是同步的.接下来介绍一下步骤: 1,设置ntp客户端 yum -y install ...

  8. FAT文件系统规范v1.03学习笔记---4.文件和目录数据区之长目录项

    1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...

  9. 嵌入式系统C编程之堆栈回溯【转】

    转自:https://www.cnblogs.com/clover-toeic/p/3949896.html 前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便 ...

  10. Yarn vs npm: 你需要知道的一切

    Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具.就像我们可以从官方文档了解那样,它的目的是解决这些团队使用 npm ...