1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <cmath> 7 8 using namespace std; 9 const int maxn=10000+100; 10 int T,n; 11 double E[maxn],K[maxn],A[maxn],B[maxn],C[maxn]; 12 vector<int>G[maxn]; 13 bool dfs(int u,int fa){ 14 double temp=0; 15 if(G[u].size()==1&&fa!=-1){ 16 A[u]=K[u]; 17 B[u]=1-K[u]-E[u]; 18 C[u]=1-K[u]-E[u]; 19 return true; 20 } 21 A[u]=K[u]; 22 B[u]=(1-K[u]-E[u])/G[u].size(); 23 C[u]=1-K[u]-E[u]; 24 for(int i=0;i<G[u].size();i++){ 25 int v=G[u][i]; 26 if(v!=fa){ 27 if(!dfs(v,u))return false; 28 A[u]+=A[v]*(1-K[u]-E[u])/G[u].size(); 29 C[u]+=(1-K[u]-E[u])/G[u].size()*C[v]; 30 temp+=B[v]*(1-K[u]-E[u])/G[u].size(); 31 } 32 } 33 if(fabs(1-temp)<=1e-10)return false; 34 A[u]/=(1-temp); 35 B[u]/=(1-temp); 36 C[u]/=(1-temp); 37 return true; 38 } 39 int main(){ 40 scanf("%d",&T); 41 for(int t=1;t<=T;t++){ 42 memset(A,0,sizeof(A)); 43 memset(B,0,sizeof(B)); 44 memset(C,0,sizeof(C)); 45 scanf("%d",&n); 46 for(int i=1;i<=n;i++)G[i].clear(); 47 int x,y; 48 for(int i=1;i<n;i++){ 49 scanf("%d%d",&x,&y); 50 G[x].push_back(y); 51 G[y].push_back(x); 52 } 53 for(int i=1;i<=n;i++){ 54 scanf("%lf%lf",&K[i],&E[i]); 55 K[i]/=100,E[i]/=100; 56 } 57 printf("Case %d: ",t); 58 if(!dfs(1,-1)||(1-A[1])<=1e-10){ 59 printf("impossible\n"); 60 continue; 61 } 62 /* for(int i=1;i<=n;i++){ 63 cout<<i<<" "<<C[i]<<endl; 64 }*/ 65 printf("%.6f\n",C[1]/(1-A[1])); 66 } 67 return 0; 68 }
原文:https://www.cnblogs.com/LQLlulu/p/9097888.html