思路二分答案,后面几个点WA。感觉错误有点像缺精度,但是有一个点输出差了37
代码如下:
#include<iostream>
#include<cstdio>
#define int long long
#define double long double
using namespace std;
int n,k[1001],head[2001],cnt,root;
bool rt[1001];
double ll[1001];
struct edge
{
int to,nxt,w,sp;
}e[2001];
void addedge(int u,int v,int w,int spe)
{
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].sp=spe;
e[cnt].nxt=head[u];
head[u]=cnt;
}
inline void dfs(int u,double l)
{
for(int i=head[u];i;i=e[i].nxt)
{
// cout<<(double)(l)/(double)100<<endl;
ll[e[i].to]=(double)(l)/100*(double)e[i].w;
if(e[i].sp&&ll[e[i].to]>(double)1) ll[e[i].to]*=ll[e[i].to];
// cout<<e[i].to<<" "<<ll[e[i].to]<<endl;
dfs(e[i].to,ll[e[i].to]);
}
}
bool check(double l)
{
dfs(root,l);
ll[root]=l;
for(int i=1;i<=n;i++)
{
// cout<<ll[i]<<" g "<<k[i]<<endl;
if(ll[i]<k[i]) return 1;
}
return 0;
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<n;i++)
{
int a,b,x,t;
scanf("%lld%lld%lld%lld",&a,&b,&x,&t);
rt[b]=1;
addedge(a,b,x,t);
}
for(int i=1;i<=n;i++) scanf("%lld",&k[i]);
for(int i=1;i<=n;i++)
{
if(!rt[i]) root=i;
}
double l=(double)1,r=(double)2000000000;
while(l<r)
{
double mid=(double)(l+r+0.00001)/2;
// cout<<mid<<endl;
if(check(mid)) l=mid;
else r=mid-(double)0.00001;
}
cout<<l;
return 0;
}