标签:
http://acm.split.hdu.edu.cn/showproblem.php?pid=4035
Special Judge
1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 #include <string> 6 #include <cmath> 7 #include <queue> 8 #include <vector> 9 using namespace std; 10 #define N 10010 11 const double eps = 1e-9; 12 13 double k[N], e[N]; 14 double A[N], B[N], C[N]; 15 vector<int> G[N]; 16 17 bool dfs(int u, int pre) 18 { 19 int l = G[u].size(); 20 A[u] = k[u]; 21 B[u] = (1 - k[u] - e[u]) / l; 22 C[u] = 1 - k[u] - e[u]; 23 double tmp = 0; 24 for(int i = 0; i < l; i++) { 25 int v = G[u][i]; 26 if(v == pre) continue; 27 if(!dfs(v, u)) return false; 28 A[u] += (1 - k[u] - e[u]) * A[v] / l; 29 C[u] += (1 - k[u] - e[u]) * C[v] / l; 30 tmp += (1 - k[u] - e[u]) * B[v] / l ; 31 } 32 if(fabs(tmp - 1) < eps) return false; 33 A[u] /= (1 - tmp); 34 B[u] /= (1 - tmp); 35 C[u] /= (1 - tmp); 36 return true; 37 } 38 39 int main() 40 { 41 int t, cas = 1; 42 scanf("%d", &t); 43 while(t--) { 44 memset(A, 0, sizeof(A)); 45 memset(B, 0, sizeof(B)); 46 memset(C, 0, sizeof(C)); 47 int n; 48 scanf("%d", &n); 49 for(int i = 0; i <= n; i++) 50 G[i].clear(); 51 for(int i = 1; i < n; i++) { 52 int u, v; 53 scanf("%d%d", &u, &v); 54 G[u].push_back(v); 55 G[v].push_back(u); 56 } 57 for(int i = 1; i <= n; i++) { 58 scanf("%lf%lf", &k[i], &e[i]); 59 k[i] /= 100; e[i] /= 100; 60 } 61 printf("Case %d: ", cas++); 62 if(dfs(1, -1) && fabs(A[1] - 1) > eps) { 63 printf("%.6f\n", C[1] / (1 - A[1])); 64 } else { 65 puts("impossible"); 66 } 67 } 68 69 return 0; 70 }
标签:
原文地址:http://www.cnblogs.com/fightfordream/p/5796616.html