BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp
首先这道题让我回忆了一下最短路算法,所以我在此做一个总结:
带权: 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的更多相关文章
- 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), ...
- luoguP4206 [NOI2005]聪聪与可可 期望概率DP
首先,分析一下这个猫和鼠 猫每局都可以追老鼠一步或者两步,但是除了最后的一步,肯定走两步快些.... 既然猫走的步数总是比老鼠多,那么它们的距离在逐渐缩小(如果这题只能走一步反而不能做了...) 猫不 ...
- 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)
[BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...
- 【BZOJ】1415: [Noi2005]聪聪和可可【期望】【最短路】【记忆化搜索】
1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2335 Solved: 1373[Submit][Stat ...
- 【bzoj1415】 Noi2005—聪聪和可可
http://www.lydsy.com/JudgeOnline/problem.php?id=1415 (题目链接) 题意 一张图,聪聪想吃可可.每单位时间聪聪可以先移动两次:可可后移动一次或停在原 ...
- bzoj1415[NOI2005]聪聪和可可
之前做的一些图上的期望步数的题大多用到高斯消元来求解(HNOI游走,SDOI走迷宫,etc),因此我一开始做这道题的时候想偏了- 这道题的性质:聪聪和可可之间的最短路长度严格递减.因为聪聪总可以多走一 ...
- BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
- 【bzoj1415】[Noi2005]聪聪和可可 期望记忆化搜索
题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
- BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】
题目 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
随机推荐
- scala成长之路(2)对象和类
scala提供了一种特殊的定义单例的方法:object关键字 scala> object Shabi{ | val age = 0 | val name = "shabi" ...
- 分享一个工作中遇得到的sql(按每天每人统计拖车次数与小修次数)
查询每人每天的数据 首先先建表 CREATE TABLE `user` ( `name` ) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CR ...
- 异步消息处理(Message, Handler, MessageQueue, Looper)
AsyncTask 适用于单线程任务处理,多任务处理还是 Message/Handler 处理方便一些 主要使用方式: 1,创建子类继承自 Handler 类,覆盖 handleMessage(Mes ...
- 【转】iOS库 .a与.framework区别
转自:http://blog.csdn.net/lvxiangan/article/details/43115131 一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态 ...
- shell -- sed用法
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...
- 利尔达NB-IOT的PSM和eDRX低功耗模式笔记
1. NB-IOT的技术优势,广覆盖,NB-IOT与GPRS和LTE相比较,最大链路预算提升了20dB,相当于提升了100倍,即使在地车车库.地下室.地下管道等普通无线网络信号难以到达的地方也容易覆盖 ...
- scidb
貌似是给科学家用的数据库,暂不研究
- 使用PSSH批量操作Linux服务器
简介 服务器多了,有一个问题就是如何批量快速操作多台服务器,在网上搜到了PSSH工具,试用了一下发现挺好用,推荐给大家. pssh是一个python编写的可以在多台服务器上执行命令的轻量级管理工具,同 ...
- Node.js的require()的工作原理
大多数人都知道Node.js中require()函数做什么的,但是有多少人知道它的工作原理呢?我们每天使用它加载库包和模块,但是它的内部行为原理很神秘. 我们追寻Node模块系统的核心: module ...
- C#非托管跨线程委托调试
使用C#调用mingw的so文件,拿视频数据回wpf的界面进行显示,注册了回调函数.C++在调用回调函数时遇到了委托被回收的问题,提示:“类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏 ...