MnZn刚学概率dp1e-7s 95pts求助
查看原帖
MnZn刚学概率dp1e-7s 95pts求助
790507
jokiiiJK楼主2024/8/12 18:53

一些WA on #2

改过很多次特判均无果

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
int n;
struct node{
	int v;
	double w;
};
vector<node>vec[maxn];
double a[maxn],dp[maxn],ans;//dp[x]+=(1-dp[x])*w*dp[to]
void init(int x,int fa){
	dp[x]=a[x];
	for(auto too:vec[x]){
		int to = too.v;
		double w = too.w;
		if(to==fa)continue;
		init(to,x);
		dp[x]+=(1-dp[x])*w*dp[to];
	}
}
void dfs(int x,int fa){
	ans+=dp[x];
	for(auto too:vec[x]){
		int to = too.v;
		double w = too.w;
		if(to==fa)continue;
		if(fabs(w*dp[to]-1.0)<1e-7){
			dfs(to,x);
			continue;
		}
		dp[x]=(w*dp[to]-dp[x])/(w*dp[to]-1.0);
		dp[to]=dp[to]+(1-dp[to])*w*dp[x];
		dfs(to,x);
		dp[to]=(w*dp[x]-dp[to])/(w*dp[x]-1.0);
		dp[x]=dp[x]+(1-dp[x])*w*dp[to];
	}
}
int main(){
	cin>>n;
	for(int i = 1,u,v,w;i<n;i++){
		cin>>u>>v>>w;
		vec[u].push_back({v,w/100.0});
		vec[v].push_back({u,w/100.0});
	}
	for(int i = 1;i<=n;i++){
		cin>>a[i];a[i]/=100.0;
		
	}
	init(1,0);
	dfs(1,0);
	
	printf("%.6lf",ans);
	
	
}
2024/8/12 18:53
加载中...