概率充电器
内存限制:256 MiB 时间限制:2000 ms 标准输入输出
题目描述
输入格式
输出格式
样例
数据范围与提示
见到期望首先想dp。
直接想联通的概率比较难码,故思考f表示不联通的概率,最终用1-f就表示联通的概率。
f[x]=不连通的概率,p[x]表示这个点直接联通概。
我们为了避免后效性高斯消元(高斯消元消不起)必须选择其他方法。
思考:我们先求出来父亲对儿子贡献,再求出儿子对父亲贡献就好了(其实就是常规树形dp)。
我们先考虑儿子对父亲的贡献。
父亲可以由每一个儿子转移过来,
父亲不连通的概率等于自己本身不连的概率乘以所有自己儿子不相连的概率
首先儿子需要联通才可以由儿子联通转移过来
,用1-f[x]表示自己儿子联通的概率
(1-f)*w表示当儿子联通的时候由儿子转移过来的概率
1-...等于不连通的概率
再让他们都相乘
于是得到
$f[x]=(1-p[x])*Π1-(1-f[son])*联通概率$
然后计算儿子的概率由父亲贡献
考虑f[v]表示除了v以外贡献
首先f[v]=1-当所有父亲被联通概率-其联通时的概率*这个边联通的概率
得到
$f[v]=(1-frac{1-f[x]}{1-(1-f[son])}*联通概率)*联通概率$
思考
思考
父亲被别的点转移过来的概率(除去v点)
$1-{frac{f[x]}{1-(1-f[v]*w)}}$1-f
表示自己儿子被转移过来的概率
(1-f)*w表示父亲与这个点相连的概率
1-..表示包含v在内的不相连的概率
再用 f[x]/...不连通的概率
至于为什么除呢 ?
例如得不病 1/5 ,不得乙病3/5 ,不甲病1/3。那么1/5*5/3=1/3=不甲病 ,1-表示联通的概率
以下依然是本人丑陋代码
/* 3 1 2 25 1 3 25 50 10 20 1.057500 先搜下再搜上 从底往上传 先搜下再搜上 从底往上传 先搜下再搜上 从底往上传 */ #include<bits/stdc++.h> #define ll int #define db double #define e 1e-9 #define inf 0x7fffffff #define A 1000100 using namespace std; ll n,m,head[A],ver[A],next[A],tot=0,xx,yy; db gai[A],zz,gl[A],f[A]; bool flag[A]; void add(ll x,ll y,db gailv) { next[++tot]=head[x]; head[x]=tot; ver[tot]=y; gai[tot]=gailv*0.01; } inline ll R() { ll X=0,F=1;char c=getchar(); while(!isdigit(c)) c=='-'?F=-1:F=F,c=getchar(); while(isdigit(c)) X=(X<<1)+(X<<3)+(c-'0'),c=getchar(); return F*X; } db dfs1(ll x,ll fa) { for(ll i=head[x];i;i=next[i]) { ll y=ver[i];db g=gai[i]; if(y==fa) continue; // printf("x=%d y=%d fx=%lf fy=%lf %lf=(1-f[y])*g ",x,y,f[x],f[y],(1-f[y])*g); dfs1(y,x);f[x]*=(1-(1-f[y])*g); } } void dfs2(ll x,ll fa) { db r; for(ll i=head[x];i;i=next[i]) { ll y=ver[i];db g=gai[i]; if(y==fa) continue; r=1.0-(f[x])/(1-(1-f[y])*g); if(fabs(r)>e&&fabs(f[y])>e) f[y]*=1-r*g; dfs2(y,x); } } int main() { n=R(); for(ll i=1;i<n;i++) { xx=R(),yy=R();scanf("%lf",&zz); add(xx,yy,zz); add(yy,xx,zz); } for(ll i=1;i<=n;i++) { scanf("%lf",&gl[i]); gl[i]*=0.01; f[i]=1-gl[i]; } memset(flag,0,sizeof(flag));dfs1(1,inf); memset(flag,0,sizeof(flag));dfs2(1,inf); db ans=0; for(ll i=1;i<=n;i++) { ans+=1-f[i]; } printf("%.6lf ",ans); }
通过写这个题解,我深查自己语言表达能力欠缺。