首页 > 代码库 > hdu-4035-Maze-树上的概率dp
hdu-4035-Maze-树上的概率dp
对于叶子节点和非叶子节点非别列公式。
然后化简公式。
和非树上的差不多。。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<queue> #include<math.h> #include<vector> using namespace std; #define eps 1e-9 #define zero(x) ((fabs(x)<eps?0:x)) #define maxn 11000 #define pb push_back double a[maxn],b[maxn],c[maxn]; double k[maxn],e[maxn],p[maxn]; vector<int>vec[maxn]; int dfs(int x,int pre) { int m=vec[x].size(); double pp=1.0*p[x]/m; a[x]=k[x]; b[x]=pp; c[x]=p[x]; double tmp; tmp=1.0; for(int i=0;i<m;i++) { int y=vec[x][i]; if(y==pre)continue; if(!dfs(y,x))return false; a[x]+=pp*a[y]; c[x]+=pp*c[y]; tmp-=pp*b[y]; } if(fabs(tmp)<eps)return false; a[x]=a[x]/tmp; b[x]=b[x]/tmp; c[x]=c[x]/tmp; return true; } int main() { int T,cas; cas=0; scanf("%d",&T); while(T--) { cas++; int n,x,y; scanf("%d",&n); for(int i=1;i<=n;i++)vec[i].clear(); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); vec[x].pb(y); vec[y].pb(x); } for(int i=1;i<=n;i++) { scanf("%lf%lf",&k[i],&e[i]); k[i]=k[i]/100.0; e[i]=e[i]/100.0; p[i]=1-k[i]-e[i]; } printf("Case %d: ",cas); if(dfs(1,-1)&&fabs(a[1]-1)>eps) { printf("%.6lf\n",c[1]/(1-a[1])); } else { puts("impossible"); } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。