[bzoj 1415]聪聪和可可

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj 1415]聪聪和可可相关的知识,希望对你有一定的参考价值。

题目大意:

猫和鼠在一无向图上,每秒猫向相邻的最靠近鼠的点(有多个取编号最小)移动,若没有位于同一点上则可再移动一步,鼠等概率向相邻点移动或静止.求猫鼠在同一点上的时间期望值.

 

过了半个月再做期望怕是有点虚~

然后这题还有记忆化DP.

代码如下(似乎跑的非常慢):

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <vector>
 4 #include <queue>
 5 using namespace std;
 6 #define mcl(a,v) memset(a,v,sizeof(a))
 7 const int N = 1010;
 8 vector<int> G[N];queue<int> q;
 9 double f[N][N];int x[N][N],dis[N][N],deg[N],sc,sm,n,m;
10 double dfs(int i,int j)
11 {
12     if(f[i][j] != -1.0) return f[i][j];
13     if(!dis[i][j]) return f[i][j] = 0.0;
14     if(dis[i][j] <= 2) return f[i][j] = 1.0;
15     f[i][j] = 0.0;
16     for(int k = 0;k < G[j].size();k++) f[i][j] += dfs(x[x[i][j]][j],G[j][k]);
17     f[i][j] = (f[i][j] + dfs(x[x[i][j]][j],j)) / (double)(deg[j] + 1) + 1;
18     return f[i][j];
19 }
20 void init(){for(int i = 0;i < N;i++) for(int j = 0;j < N;j++) f[i][j] = -1.0;mcl(dis,-1);mcl(deg,0);mcl(x,0x3c);}
21 void pre()
22 {
23     for(int i = 1;i <= n;i++)
24     {
25         dis[i][i] = 0;q.push(i);
26         while(!q.empty())
27         {
28             int a = q.front();q.pop();
29             for(int k = 0;k < G[a].size();k++) if(dis[i][G[a][k]] == -1.0) {dis[i][G[a][k]] = dis[i][a] + 1;q.push(G[a][k]);}
30         }
31     }
32     for(int i = 1;i <= n;i++) for(int k = 0;k < G[i].size();k++) for(int j = 1;j <= n;j++) if((dis[i][j] == dis[G[i][k]][j] + 1) && (x[i][j] > G[i][k])) x[i][j] = G[i][k];
33 }
34 int main()
35 {
36     scanf("%d %d %d %d",&n,&m,&sc,&sm);
37     init();for(int i = 1,u,v;i <= m;i++){scanf("%d %d",&u,&v);G[u].push_back(v);G[v].push_back(u);deg[u]++;deg[v]++;}pre();
38     printf("%.3f\n",dfs(sc,sm));
39     return 0;
40 }

 

以上是关于[bzoj 1415]聪聪和可可的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1415 [Noi2005]聪聪和可可——概率期望

[bzoj 1415]聪聪和可可

BZOJ1415: [Noi2005]聪聪和可可

BZOJ1415NOI2005聪聪和可可(动态规划,数学期望)

BZOJ1415 [Noi2005]聪聪和可可

BZOJ1415 [Noi2005]聪聪和可可 概率与期望