orz,
5
1 2 90
1 3 80
1 4 70
1 5 60
100 10 20 30 40
4.300000
我认为每个点的概率为它自己来电的概率加上其他点通过若干个导线到达这个点的概率
于是用O(???)写暴力对于每个点都作为根跑dfs
#include<bits/stdc++.h>
using namespace std;
namespace Testify{
inline int read(){
int f(1),x(0);
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
return f*x;
}
inline void Write(int x){
if(x>9) Write(x/10);
putchar(x%10+48);
}
inline void write(int x){
if(x<0) putchar('-'),x=-x;
Write(x);
putchar('\n');
}
}
using namespace Testify;
int n;
const int N=5e5+555;
int head[N],nxt[N<<1],to[N<<1],tot(0);
double optbian[N<<1];
inline void add(int x,int y,double val){
to[++tot]=y,nxt[tot]=head[x],head[x]=tot,optbian[tot]=val;
return ;
}
double optdian[N],nowdian[N],zhongdian[N];
inline void dfs(int now,int fa,double val){
nowdian[now]+=(val*nowdian[fa]);
for(register int i=head[now];i;i=nxt[i]){
int y=to[i];
if(y==fa) continue;
dfs(y,now,optbian[i]);
}
}
signed main(){
system("title IZANA");
// system("title ?超絶最かわ?てんしちゃん");
n=read();
for(register int i=1;i<n;i++){
register int asd=read(),jkl=read();
double val;
scanf("%lf",&val);
add(asd,jkl,val/100),add(jkl,asd,val/100);
}
for(register int i=1;i<=n;i++){
double tmp;
scanf("%lf",&tmp);
optdian[i]=tmp/100;
}
for(register int i=1;i<=n;i++){
if(optdian[i]){
memset(nowdian,0,sizeof(nowdian));
// for(register int i=1;i<=N;i++){
// if(optdian[i]){
// nowdian[i]=optdian[i];
// }
// else {
// nowdian[i]=0;
// }
// }
nowdian[i]=optdian[i];
dfs(i,0,0);
for(register int i=1;i<=n;i++){
if(!nowdian[i]) continue;
zhongdian[i]+=nowdian[i];
zhongdian[i]=min(1.0,zhongdian[i]);
}
}
}
double Tempestissimo(0);
for(register int i=1;i<=n;i++){
// cerr<<zhongdian[i]<<" ";
Tempestissimo+=zhongdian[i];
}
cerr<<endl;
printf("%.6lf",Tempestissimo);
return 0;
}
但是我模拟样例2也没模拟出来4.300000 😭
求解释样例

