hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会

  1 /*
  2 HDU 4035
  3
  4     dp求期望的题。
  5     题意:
  6     有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树,
  7     从结点1出发,开始走,在每个结点i都有3种可能:
  8         1.被杀死,回到结点1处(概率为ki)
  9         2.找到出口,走出迷宫 (概率为ei)
 10         3.和该点相连有m条边,随机走一条
 11     求:走出迷宫所要走的边数的期望值。
 12
 13     设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望。E[1]即为所求。
 14
 15     叶子结点:
 16     E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i]] + 1);
 17          = ki*E[1] + (1-ki-ei)*E[father[i]] + (1-ki-ei);
 18
 19     非叶子结点:(m为与结点相连的边数)
 20     E[i] = ki*E[1] + ei*0 + (1-ki-ei)/m*( E[father[i]]+1 + ∑( E[child[i]]+1 ) );
 21          = ki*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei)/m*∑(E[child[i]]) + (1-ki-ei);
 22
 23     设对每个结点:E[i] = Ai*E[1] + Bi*E[father[i]] + Ci;
 24
 25     对于非叶子结点i,设j为i的孩子结点,则
 26     ∑(E[child[i]]) = ∑E[j]
 27                    = ∑(Aj*E[1] + Bj*E[father[j]] + Cj)
 28                    = ∑(Aj*E[1] + Bj*E[i] + Cj)
 29     带入上面的式子得
 30     (1 - (1-ki-ei)/m*∑Bj)*E[i] = (ki+(1-ki-ei)/m*∑Aj)*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei) + (1-ki-ei)/m*∑Cj;
 31     由此可得
 32     Ai =        (ki+(1-ki-ei)/m*∑Aj)   / (1 - (1-ki-ei)/m*∑Bj);
 33     Bi =        (1-ki-ei)/m            / (1 - (1-ki-ei)/m*∑Bj);
 34     Ci = ( (1-ki-ei)+(1-ki-ei)/m*∑Cj ) / (1 - (1-ki-ei)/m*∑Bj);
 35
 36     对于叶子结点
 37     Ai = ki;
 38     Bi = 1 - ki - ei;
 39     Ci = 1 - ki - ei;
 40
 41     从叶子结点开始,直到算出 A1,B1,C1;
 42
 43     E[1] = A1*E[1] + B1*0 + C1;
 44     所以
 45     E[1] = C1 / (1 - A1);
 46     若 A1趋近于1则无解...
 47
 48 */
 49 #include<stdio.h>
 50 #include<string.h>
 51 #include<algorithm>
 52 #include<iostream>
 53 #include<math.h>
 54 #include<vector>
 55 using namespace std;
 56 const int MAXN=10010;
 57 const double eps=1e-9;//这里1e-8会WA。设为1e-9和1e-10可以
 58 double k[MAXN],e[MAXN];
 59 double A[MAXN],B[MAXN],C[MAXN];
 60
 61 vector<int>vec[MAXN];//存树
 62
 63 bool dfs(int t,int pre)//t的根结点是pre
 64 {
 65     int m=vec[t].size();//点t的度
 66     A[t]=k[t];
 67     B[t]=(1-k[t]-e[t])/m;
 68     C[t]=1-k[t]-e[t];
 69     double tmp=0;
 70     for(int i=0;i<m;i++)
 71     {
 72         int v=vec[t][i];
 73         if(v==pre)continue;
 74         if(!dfs(v,t))return false;
 75         A[t]+=(1-k[t]-e[t])/m*A[v];
 76         C[t]+=(1-k[t]-e[t])/m*C[v];
 77         tmp+=(1-k[t]-e[t])/m*B[v];
 78     }
 79     if(fabs(tmp-1)<eps)return false;
 80     A[t]/=(1-tmp);
 81     B[t]/=(1-tmp);
 82     C[t]/=(1-tmp);
 83     return true;
 84 }
 85 int main()
 86 {
 87    // freopen("in.txt","r",stdin);
 88    // freopen("out.txt","w",stdout);
 89     int T;
 90     int n;
 91     int u,v;
 92     int iCase=0;
 93     scanf("%d",&T);
 94     while(T--)
 95     {
 96         iCase++;
 97         scanf("%d",&n);
 98         for(int i=1;i<=n;i++)vec[i].clear();
 99         for(int i=1;i<n;i++)
100         {
101             scanf("%d%d",&u,&v);
102             vec[u].push_back(v);
103             vec[v].push_back(u);
104         }
105         for(int i=1;i<=n;i++)
106         {
107             scanf("%lf%lf",&k[i],&e[i]);
108             k[i]/=100;
109             e[i]/=100;
110         }
111         printf("Case %d: ",iCase);
112         if(dfs(1,-1)&&fabs(1-A[1])>eps)
113         {
114             printf("%.6lf\n",C[1]/(1-A[1]));
115         }
116         else printf("impossible\n");
117     }
118 }
时间: 2024-11-03 21:57:00

hdu 4035 2011成都赛区网络赛E 概率dp ****的相关文章

hdu 4050 2011北京赛区网络赛K 概率dp ***

题目:给出1-n连续的方格,从0开始,每一个格子有4个状态,左右脚交替,向右跳,而且每一步的步长必须在给定的区间之内.当跳出n个格子或者没有格子可以跳的时候就结束了,求出游戏的期望步数 0:表示不能到达这个格子 1:表示左脚跳进这个格子 2:表示右脚跳进这个格子 3:随意哪个脚跳进这个格子,而且下一步随意用哪个脚 dp[i][j] :表示走到第 i 个格子在 j 状态的期望. 当j=1时,你可以走到dp[i+k][2],dp[i+k][3], 当j=2时,你可以走到dp[i+k][1],dp[i

hdu 4033 2011成都赛区网络赛 余弦定理+二分 **

二分边长,判断最后内角和是否为2pi,注意l与r的选取,保证能组成三角形 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000

hdu 4031 2011成都赛区网络赛A题 线段树 ***

就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9

hdu 4036 2011成都赛区网络赛F 模拟 **

为了确保能到达终点,我们需要满足下面两个条件 1.能够到达所有山顶 2.能够在遇到苦土豆时速度大于他 二者的速度可以用能量守恒定律做,苦土豆的坐标可通过三角形相似性来做 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<map> using na

hdu 4034 2011成都赛区网络赛 逆向floyd **

给出一个最短路邻接矩阵,求出构图的最小边数 正常的floyd的k放在最外面是为了防止i到j的距离被提前确定,而逆向的floyd,i到j的距离已经确定,所以需要在i到j之间枚举k,注意需要break,否则会多删除 Sample Input 3 3 0 1 1 1 0 1 1 1 0 3 0 1 3 4 0 2 7 3 0 3 0 1 4 1 0 2 4 2 0 Sample Output Case 1: 6 Case 2: 4 Case 3: impossible 1 #include<cstdi

hdu 4044 2011北京赛区网络赛E 树形dp ****

专题训练 1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 const int MAXN=1010; 7 const int INF=0x3fffffff; 8 struct Node 9 { 10 int to; 11 int next; 12 }edge[MAXN*2]; 13 int t

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

hdu 4026 2011上海赛区网络赛F TSP ****

没看过TSP,先mark 1 //4838039 2011-10-27 23:04:15 Accepted 4026 2343MS 31044K 3143 B C++ Geners 2 //状态压缩DP的TSP问题 3 //优先级位运算小于判等 , 还有各种细节各种出错 4 #include <cstdio> 5 #include <cstring> 6 #include <stdlib.h> 7 #define mabs(a) (a>0?a:-(a)) 8 9

hdu 4023 2011上海赛区网络赛C 贪心+模拟

以为是贪心,结果不是,2333 贪心最后对自己绝对有利的情况 点我 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 10000000