[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]聪聪和可可的主要内容,如果未能解决你的问题,请参考以下文章