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行 ...
随机推荐
- Could not obtain transaction-synchronized Session for current thread 错误的解决方法!
BsTable bsTable = new BsTable(); // String time = request.getParameter("date"); String tim ...
- 2.3 进程控制之exec函数族
学习目标:学习使用exec函数族的重要的几个函数 一.引言 进程通过exec函数根据指定的文件名或目录名执行另一个可执行文件,当进程调用exec函数时,该进程的数据段.代码段和堆栈段完全被新程序替换 ...
- C语言Windows程序开发—TextOut函数介绍【第02天】
(一)TextOut函数的参数介绍: BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE HDC hdc, //用于显示字符串的控件ID int nXStart, ...
- mybatis动态列名
mybatis动态列名 <select id="getUser" resultType="java.util.Map" parameterType=&qu ...
- (数据科学学习手札02)Python与R在循环语句与条件语句上的异同
循环是任何一种编程语言的基本设置,是进行批量操作的基础,而条件语句是进行分支运算的基础,Python与R有着各自不同的循环语句与条件语句语法,也存在着一些相同的地方. Python 1.for循环 ' ...
- python2.7练习小例子(二十六)
26):题目:给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. 程序分析:学会分解出每一位数. 程序源代码: #!/usr/bin/python # ...
- Java - 问题集 - 导出csv文件中文乱码
微软的excel文件需要通过文件头的bom来识别编码,所以写文件时,需要先写入bom头. FileOutputStream fos = new FileOutputStream(new File(&q ...
- Word 2013 无法撤销操作的错误
来自 <http://delxu.blog.51cto.com/975660/1409139> 关闭正在运行的所有程序. 按Win-R,在运行框中键入regedit,然后单击“确定”. 在 ...
- KVM WEB管理工具——WebVirtMgr(二)日常配置
配置宿主机 1.登录WebVirtMgr管理平台 2.添加宿主机 选择首页的WebVirtMgr -->Addd Connection 选择“SSH链接“,设置Label,IP,用户 注意:La ...
- Python之tornado框架原理
Python web框架 1.简单概念 tornado socket.逻辑处理 Django flask 逻辑处理 第三方处理模块(包含了socket) jinja2模块 Models 数据库处理 V ...