3 3 1 2 1 3 0 0 100 0 0 100 3 1 2 2 3 0 0 100 0 0 100 6 1 2 2 3 1 4 4 5 4 6 0 0 20 30 40 30 50 50 70 10 20 60
Case 1: 2.000000 Case 2: impossible Case 3: 2.895522
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=22000;
//dp[i]=ki*dp[1]+pet*(dp[j]+1)+pet*(dp[fath]+1)
//从底向上 层层递推
//最上层解出dp[1]即可
struct Node
{
int t;
int flag;
int next;
};
int n;
double k[maxn],e[maxn];
double c[maxn],x[maxn],f[maxn];//常数系数和dp1系数 fath的系数
int p[maxn];
int l;
Node G[maxn];
void init()
{
memset(p,-1,sizeof(p));
l=0;
}
void addedge(int u,int t)
{
G[l].t=t;
G[l].flag=0;
G[l].next=p[u];
p[u]=l++;
}
void dfs(int u,int fath)
{
c[u]=0;x[u]=k[u]/100;
int cnt=0;
for(int i=p[u];i!=-1;i=G[i].next)
{
int t=G[i].t;
cnt++;
}
double pet;
pet=(100-k[u]-e[u])/cnt/100;
if(u!=1) f[u]=pet,c[u]+=pet;
double res=0;
for(int i=p[u];i!=-1;i=G[i].next)
{
int t=G[i].t;
if(t==fath) continue;
dfs(t,u);
c[u]+=pet*(1+c[t]);x[u]+=pet*x[t];
res+=pet*f[t];
}
c[u]/=(1-res),x[u]/=(1-res),f[u]/=(1-res);
}
int main()
{
int ci,pl=1;scanf("%d",&ci);
while(ci--)
{
scanf("%d",&n);
init();
for(int i=0;i<n-1;i++)
{
int u,t;scanf("%d%d",&u,&t);
addedge(u,t);
addedge(t,u);
}
for(int i=1;i<=n;i++) scanf("%lf%lf",&k[i],&e[i]);
//1树根
memset(c,0,sizeof(c));
memset(x,0,sizeof(x));
memset(f,0,sizeof(f));
dfs(1,-1);
printf("Case %d: ",pl++);
if(fabs(x[1]-1)<1e-10) printf("impossible\n");//-8不够 得-10
else printf("%.6lf\n",c[1]/(1-x[1]));
}
return 0;
}