莫名互测题...

这题一看就是期望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. IDEA-使用技巧

    IDEA--个性化配置 - 心飞扬的博客 - CSDN博客--里面很好,http://blog.csdn.net/afzaici/article/details/71524643 IntelliJ I ...

  2. Spring4之AOP

    [www.dev1234.com]一头扎进Spring4视频教程\一头扎进Spring4源码\[www.java1234.com]<一头扎进Spring4>第七讲 源码 [www.dev1 ...

  3. java--GC Root有哪些

    GC管理的主要区域是Java堆,一般情况下只针对堆进行垃圾回收.方法区.JVM栈和Native栈不被GC所管理,因而选择这些非堆区的对象作为GC roots,被GC roots引用的对象不被GC回收. ...

  4. java实现在线浏览PDF文档功能

    实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...

  5. MySql cmd下的学习笔记 —— 引擎和事务(engine,transaction)

    engine 引擎就是MySQL存储数据的不同方式 myisam 插入速度快 支持全文索引 innoDB 插入速度慢 支持事务安全 假设两人同时购买火车票,两人同时看到只有一张火车票,几乎同时下单 或 ...

  6. 使用@Valid和BindingResult验证请求参数的合法性并处理校验结果

    /** * 添加用户,使用@RequestBody将请求体映射到Action方法参数中 * 使用@Valid注解验证请求参数的合法性 * 使用BindingResult处理校验结果 * @param ...

  7. 题解-PKUWC2018 随机游走

    Problem loj2542 题意:一棵 \(n\) 个结点的树,从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去,询问走完一个集合 \(S\)的期望时间,多组询问 \(n\le ...

  8. python操作三大主流数据库(9)python操作mongodb数据库③mongodb odm模型mongoengine的使用

    python操作mongodb数据库③mongodb odm模型mongoengine的使用 文档:http://mongoengine-odm.readthedocs.io/guide/ 安装pip ...

  9. corba/ice/web service/com+

    //todo model1 model2

  10. c++内存对齐原理

    转载自http://blog.csdn.net/it_yuan/article/details/24651347 #类中的元素 0. 成员变量   1. 成员函数   2. 静态成员变量   3. 静 ...