首先这道题让我回忆了一下最短路算法,所以我在此做一个总结:

带权: Floyed:O(n3)

SPFA:O(n+m),这是平均复杂度实际上为O(玄学)

Dijkstra:O(n+2m),堆优化以后

因此,稀疏图:SPFA或 Dijkstra可以再大约O(n2)左右的时间跑完每个点到每个点的最短路

稠密图:啥也别说 Floyed

不带权(边权为1):SPFA=Dijkstra(堆优化)=BFS=O(n+2m) ,这个是真的差距只有常数

Floyed:O(n3)

因此,同上

从这个题我得出来一点期望概率dp的小思路:找到各个状态间的核心逻辑关系

这个题就是 f[cat][mouse]=∑f[cat一下子扑到][mouse走到]

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define MAXN 1010
using namespace std;
typedef double D;
D f[MAXN][MAXN];
int n,m,s,e,d[MAXN][MAXN],dis[MAXN][MAXN],via[MAXN][MAXN],q[MAXN],head,tail,sz,now;
struct Two
{
int a,b;
}two[MAXN*MAXN];
int comp(const Two a,const Two b)
{
return dis[a.a][a.b]<dis[b.a][b.b];
}
inline void blabla()
{
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
printf("%d live %d with %lf\n",i,j,f[i][j]);
}
inline void bfs(int st)
{
head=;
tail=;
q[++tail]=st;
while(tail>=head)
{
int x=q[head++];
for(int i=;i<=via[x][];i++)
if(dis[st][via[x][i]]==&&via[x][i]!=st)
{
dis[st][via[x][i]]=dis[st][x]+;
if(dis[st][via[x][i]]<=) d[st][via[x][i]]=via[x][i];
else d[st][via[x][i]]=d[st][x];
q[++tail]=via[x][i];
}
}
}
void pre()
{
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
via[x][++via[x][]]=y;
via[y][++via[y][]]=x;
}
for(int i=;i<=n;i++)
sort(via[i]+,via[i]+via[i][]+);
for(int i=;i<=n;i++)
bfs(i);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j)
{
two[++sz].a=i;
two[sz].b=j;
}
sort(two+,two+sz+,comp);
}
void work()
{
now=;
while(now<=sz)
{
++now;
if(dis[two[now].a][two[now].b]<=)
{
f[two[now].a][two[now].b]=1.0;
continue;
}
int x=d[two[now].a][two[now].b],y=two[now].b;
f[two[now].a][two[now].b]+=f[x][y]*1.0/(1.0+via[y][]*1.0)+1.0;
for(int i=;i<=via[y][];i++)
f[two[now].a][two[now].b]+=f[x][via[y][i]]*1.0/(1.0+via[y][]);
}
}
int main()
{
freopen("cchkk.in","r",stdin);
freopen("cchkk.out","w",stdout);
pre();
work();
printf("%.3lf",f[s][e]);
return ;
}

BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp的更多相关文章

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

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

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

  3. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

    [BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...

  4. 【BZOJ】1415: [Noi2005]聪聪和可可【期望】【最短路】【记忆化搜索】

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2335  Solved: 1373[Submit][Stat ...

  5. 【bzoj1415】 Noi2005—聪聪和可可

    http://www.lydsy.com/JudgeOnline/problem.php?id=1415 (题目链接) 题意 一张图,聪聪想吃可可.每单位时间聪聪可以先移动两次:可可后移动一次或停在原 ...

  6. bzoj1415[NOI2005]聪聪和可可

    之前做的一些图上的期望步数的题大多用到高斯消元来求解(HNOI游走,SDOI走迷宫,etc),因此我一开始做这道题的时候想偏了- 这道题的性质:聪聪和可可之间的最短路长度严格递减.因为聪聪总可以多走一 ...

  7. BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  8. 【bzoj1415】[Noi2005]聪聪和可可 期望记忆化搜索

    题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  9. BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】

    题目 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

随机推荐

  1. thinkphp phpmailer邮箱验证

    thinkphp 关于phpmailer的邮箱验证 一  . 登陆自己的邮箱,例如:qq邮箱.登陆qq邮箱在账户设置中开启smtp服务: 之后回发送一个授权码 , 这个授权码先保存下来,这个授权码在后 ...

  2. Elasticsearch 常用API

    1.   Elasticsearch 常用API 1.1.数据输入与输出 1.1.1.Elasticsearch 文档   #在 Elasticsearch 中,术语 文档 有着特定的含义.它是指最顶 ...

  3. python3 练习题100例 (二十二)输入两个字符串,输出两个字符串集合的并集

    题目内容: 输入两个字符串,输出两个字符串集合的并集. 为保证输出结果一致,请将集合内元素排序之后再输出, 如对于集合aset,可输出sorted(aset). 输入格式: 共两行,每一行为一个字符串 ...

  4. 按升序打印X,Y,Z的整数值

    #include <stdio.h> #define TRUE 1 #define FALSE 0 int main() { int x,y,z; printf("x: &quo ...

  5. Oracle错误记录

    1 SQLPlus无法登陆oracle,PLSql可以登陆,报错ORA-12560 环境变量 右击计算机属性-->高级系统设置-->高级-->环境变量-->系统变量--> ...

  6. java中array,arrayList,iterator;

    Array        String []a = new String[10] ;  a[0] = "test" ; String []a = new String[]{&quo ...

  7. Mootools 学习随笔

    简单的介绍下Mootools: MooTools是一个简洁,模块化,面向对象的开源JavaScript web应用框架.在处理js.css.html时候,为web开发者提供了一个跨浏览器的js解决方案 ...

  8. 第七篇数字&字符串之练习题

    1.执行Python脚本的两种方式2.简述位.字节的关系3.简述ascii.unicode.utf-­‐8.gbk的关系4.请写出“李杰”分别用utf-­‐8和gbk编码所占的位数5.Pyhton单行 ...

  9. json与python解析

    1.json.dumps     将 Python 对象编码成 JSON 字符串   json.loads      将已编码的 JSON 字符串解码为 Python 对象 2.json.dump() ...

  10. Struts2(二.用户登录模块)

    1.编写Javabean /src/myuser/User.java 在strut1中,Javabean需要继承于struts1 api中的ActionForm类.struts2没有此要求 strut ...