题目大意:有小a和小b,其中一个人到处乱走,每次走一步;另一个人抄近路逼近,每次1-2步。求期望路程。

整解:跑1000遍最短路/bfs,求两两距离,然后找从x逼近y第一步去哪,最后期望dp收场。

dp方程很简单,关键在于实现。

代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define N 1050
  7. int n,E,xr,xz,hed[N],cnt;
  8. double ind[N];
  9. struct EG
  10. {
  11. int to,nxt;
  12. }e[*N];
  13. void ae(int f,int t)
  14. {
  15. e[++cnt].to = t;
  16. e[cnt].nxt = hed[f];
  17. hed[f] = cnt;
  18. }
  19. int dis[N][N],chos[N][N];
  20. bool vis[N];
  21. struct node
  22. {
  23. int x,d;
  24. node(){}
  25. node(int x,int d):x(x),d(d){}
  26. friend bool operator < (node a,node b)
  27. {
  28. return a.d>b.d;
  29. }
  30. }tp;
  31. priority_queue<node>q;
  32. void dij(int rt)
  33. {
  34. dis[rt][rt]=;
  35. memset(vis,,sizeof(vis));
  36. q.push(node(rt,));
  37. while(!q.empty())
  38. {
  39. tp = q.top();
  40. q.pop();
  41. int u = tp.x;
  42. if(vis[u])continue;
  43. vis[u]=;
  44. for(int j=hed[u];j;j=e[j].nxt)
  45. {
  46. int to = e[j].to;
  47. if(dis[rt][to]>dis[rt][u]+)
  48. {
  49. dis[rt][to]=dis[rt][u]+;
  50. q.push(node(to,dis[rt][to]));
  51. }
  52. }
  53. }
  54. }
  55. double f[N][N];
  56. double dp(int x,int y)
  57. {
  58. if(f[x][y]+1.0!=)return f[x][y];
  59. if(x==y)return f[x][y]=0.0;
  60. if(dis[x][y]<=)return f[x][y]=1.0;
  61. f[x][y]=;
  62. int k = chos[chos[x][y]][y];//走两步
  63. for(int j=hed[y];j;j=e[j].nxt)
  64. f[x][y]+=dp(k,e[j].to);
  65. f[x][y]+=dp(k,y);
  66. f[x][y] = (f[x][y]/(ind[y]+1.0))+1.0;
  67. return f[x][y];
  68. }
  69. int main()
  70. {
  71. // freopen("eat.in","r",stdin);
  72. // freopen("eat.out","w",stdout);
  73. scanf("%d%d%d%d",&n,&E,&xr,&xz);
  74. for(int u,v,i=;i<=E;i++)
  75. {
  76. scanf("%d%d",&u,&v);
  77. ae(u,v),ae(v,u);
  78. ind[u]++,ind[v]++;
  79. }
  80. memset(dis,0x3f,sizeof(dis));
  81. for(int i=;i<=n;i++)
  82. dij(i);
  83. memset(chos,0x3f,sizeof(chos));
  84. for(int i=;i<=n;i++)
  85. {
  86. for(int j=;j<=n;j++)
  87. {
  88. if(dis[i][j]==0x3f3f3f3f||i==j)continue;
  89. for(int k=hed[i];k;k=e[k].nxt)
  90. {
  91. int to = e[k].to;
  92. if(dis[to][j]+==dis[i][j]&&to<chos[i][j])
  93. chos[i][j]=to;
  94. }
  95. }
  96. }
  97. for(int i=;i<=n;i++)
  98. for(int j=;j<=n;j++)
  99. f[i][j]=-1.0;
  100. printf("%.3lf\n",dp(xr,xz));
  101. return ;
  102. }

[NOI2005]聪聪与可可的更多相关文章

  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. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

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

  3. 【NOI2005】聪聪和可可 概率与期望 记忆化搜索

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 958[Submit][Statu ...

  4. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description I ...

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

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

  6. 【BZOJ】【1415】【NOI2005】聪聪和可可

    数学期望+记忆化搜索 论文:<浅析竞赛中一类数学期望问题的解决方法>——汤可因  中的第一题…… Orz 黄学长 我实在是太弱,这么简单都yy不出来…… 宽搜预处理有点spfa的感觉= = ...

  7. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  8. P4206[NOI2005]聪聪与可可

    链接P4206 [NOI2005]聪聪与可可 类似于开车旅行,如果老鼠确定了那么猫的路线是确定的. 预处理\(g_{i,j}\)表示老鼠在\(i\)号点,猫的下一步方向,\(Bfs\)就行了 设\(f ...

  9. BZOJ 1415 【NOI2005】 聪聪和可可

    题目链接:聪聪和可可 一道水题--开始还看错题了,以为边带权--强行\(O(n^3)\)预处理-- 首先,我们显然可以预处理出一个数组\(p[u][v]\)表示可可在点\(u\),聪聪在点\(v\)的 ...

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

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

随机推荐

  1. logback 使用详解 (转)

    详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透彻的理解其配置 logback 常用配置详解(序)logback 简介 logback 常用配置详解(一)<c ...

  2. bzoj 3779: 重组病毒【LCT+线段树维护dfs序】

    %.8lf会WA!!%.8lf会WA!!%.8lf会WA!!要%.10lf!! 和4817有点像,但是更复杂. 首先对于操作一"在编号为x的计算机中植入病毒的一个新变种,在植入一个新变种时, ...

  3. [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. ios手机Safari本地服务连不上

    问题: 今天在本地起服务准备测下ios手机端页面,结果发现:页面可以打开,但是登录不上. 用alert定位了下,await fn() 报错被try()catch(){}捕获了... 原因: 该机子不支 ...

  5. 标准字符cp功能

    #include<stdio.h> #include<fcntl.h> int main(int argc,char *argv[]) { FILE *src_fp,*des_ ...

  6. windows deintall 12c client

    1.unintall: close all oracle app C:\app\client\CICadmin\product\12.1.0\client_1\deinstall deinstall ...

  7. 438 Find All Anagrams in a String 找出字符串中所有的变位词

    详见:https://leetcode.com/problems/find-all-anagrams-in-a-string/description/ C++: class Solution { pu ...

  8. webapp开发学习---Cordova环境搭建

    Cordova 使用HTML, CSS & JS进行移动App开发;多平台共用一套代码;免费开源 步骤:(来自Cordova官网) 1.安装Cordova(在node.js环境下进行安装) 命 ...

  9. 多个文本框点击复制 zClip (ZeroClipboard)有关问题

    <script type="text/javascript" src="js/jquery.min.js"$amp;>amp;$lt;/script ...

  10. Spark学习之Spark调优与调试(7)

    Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...