[BZOJ 1415][NOI 2005]聪聪和可可(SPFA+概率DP)
来源:互联网 发布:华大基因 知乎 编辑:程序博客网 时间:2024/05/16 17:50
题目链接
http://www.lydsy.com/JudgeOnline/problem.php?id=1415
思路
根据题目要求,聪聪每次从旧点
那么我们可以根据这些特点,首先通过
显然这个DFS可以通过记忆化来优化,优化后这个做法就能AC
代码
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>#define MAXE 2100#define MAXV 1100using namespace std;struct edge{ int u,v,w,next;}edges[MAXE];int head[MAXV],nCount=0;void AddEdge(int U,int V,int W){ edges[++nCount].u=U; edges[nCount].v=V; edges[nCount].w=W; edges[nCount].next=head[U]; head[U]=nCount;}int q[MAXE*2],dist[MAXV];bool inQueue[MAXV];int pos[MAXV][MAXV]; //pos[i][j]=i到j的最短路上与i相邻且编号最小的点编号double f[MAXV][MAXV]; //f[i][j]=聪聪在点i,可可在点j,聪聪抓住可可所需期望步数void SPFA(int S){ memset(inQueue,false,sizeof(inQueue)); memset(dist,0x3f,sizeof(dist)); int h=0,t=0; dist[S]=0; for(int p=head[S];p!=-1;p=edges[p].next) { int v=edges[p].v; q[t++]=v; dist[v]=1; pos[S][v]=v; //!!!!! inQueue[v]=true; } while(h<t) { int u=q[h++]; inQueue[u]=false; for(int p=head[u];p!=-1;p=edges[p].next) { int v=edges[p].v; if(dist[u]+edges[p].w<dist[v]) { dist[v]=dist[u]+edges[p].w; pos[S][v]=pos[S][u]; if(!inQueue[v]) { q[t++]=v; inQueue[v]=true; } } else if(dist[u]+edges[p].w==dist[v]&&pos[S][u]<pos[S][v]) { pos[S][v]=pos[S][u]; if(!inQueue[v]) { q[t++]=v; inQueue[v]=true; } } } }}void DFS(int u,int v) //求f[u][v]{ if(f[u][v]>=0) return; int nextu=pos[pos[u][v]][v]; //一般情况下u在下一时刻走到的位置 int cnt_child=0; //v的后继个数 double sum=0; //sum=nextu到所有v的后继的期望步数之和 if(nextu==v) //直接在下一时刻抓到了可可,那么吃到可可的期望步数就是1次 { f[u][v]=1; return; } for(int p=head[v];p!=-1;p=edges[p].next) { int nextv=edges[p].v; DFS(nextu,nextv); sum+=f[nextu][nextv]; cnt_child++; } DFS(nextu,v); sum+=f[nextu][v]; cnt_child++; f[u][v]=sum/cnt_child+1; //u到nextu走了一步,所以要加1}int n,m;int main(){ int S,T; scanf("%d%d%d%d",&n,&m,&S,&T); memset(head,-1,sizeof(head)); memset(f,-1,sizeof(f)); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); AddEdge(u,v,1); AddEdge(v,u,1); } for(int i=1;i<=n;i++) //n次SPFA预处理出所有的pos[i][j] { f[i][i]=0; //相遇直接吃掉,无需移动 pos[i][i]=i; SPFA(i); } DFS(S,T); printf("%.3lf\n",f[S][T]); return 0;}
1 0
- [BZOJ 1415][NOI 2005]聪聪和可可(SPFA+概率DP)
- BZOJ 1415|NOI 2005|聪聪和可可|概率期望|动态规划
- bzoj 1415 聪聪和可可(概率DP)
- BZOJ 1415: [Noi2005]聪聪和可可|概率dp
- BZOJ 1415 [Noi2005]聪聪和可可【概率dp】
- bzoj 1415 [Noi2005]聪聪和可可 概率dp
- NOI 2005(BZOJ 1415)聪聪和可可
- 1415: [Noi2005]聪聪和可可(BFS+SPFA+概率DP)
- [NOI 2005]聪聪和可可(DP)
- BZOJ 1415: [Noi2005]聪聪和可可 概率DP,记忆化搜索,BFS
- NOI 2005 聪聪和可可
- BZOJ 1415: [Noi2005]聪聪和可可 期望dp
- BZOJ 1415聪聪和可可 期望dp
- bzoj 1415 聪聪和可可 (期望dp)
- bzoj 1415: [Noi2005]聪聪和可可 (概率与期望)
- 【BZOJ 1415】 [Noi2005]聪聪和可可
- BZOJ 1415: [Noi2005]聪聪和可可
- bzoj 1415 聪聪和可可 【期望】
- C和指针读书笔记-第11章(动态内存分配)
- Unix网络编程卷一: 从服务器获取时间信息(三)-daytimetcpcli2客户端每次执行结果不同
- 挑战程序设计竞赛 1.61 nlogn算法
- Mysql存储引擎
- bash: ifconfig: command not found 解决办法
- [BZOJ 1415][NOI 2005]聪聪和可可(SPFA+概率DP)
- Android项目开发,不能不了解的第三方库!(齐全)
- 如何获取显示器的EDID信息
- 读书笔记---arm-linux-objdump命令解析
- Oracle通过DBLink操作数据表,报错“ORA-22992:无法使用从远程表选择的lob定位器”
- Web安全技术(4)-常见的攻击和防御
- postgresql以及mysql的数据导出导入到文件
- SCITE的用户配置文档
- JS判断一个数组中是否有重复值的三种方法来自