版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/82844834
#include<bits/stdc++.h>
#define mn 1111111
#define db double
using namespace std;
struct node{
int x,y;
}e[mn];
const int INF=2e9;
int n,mod,c,a[mn],v[mn],h[mn],q[mn],vis[mn];
db ans,f[mn][2],s[mn],p[mn],eps=1e-7;
void add(int x,int y)
{
e[++c].x=h[x];
e[c].y=y;
h[x]=c;
}
void dfs(int x,int y,db z)
{
for (int i=h[x];i>0;i=e[i].x)
if(e[i].y!=y)
dfs(e[i].y,x,z);
q[0]=s[0]=0;
p[0]=-1*INF;
for (int i=h[x];i>0;i=e[i].x)
if (e[i].y!=y)
q[++q[0]]=e[i].y;
for (int i=1;i<=q[0];i++)
{
s[i]=s[i-1]+f[q[i]][1];
p[i]=max(p[i-1]+f[q[i]][1],s[i-1]+f[q[i]][0]);
}
f[x][0]=s[q[0]]+v[x]-z; f[x][1]=s[q[0]];
for (int i=1;i<=q[0];i++)
{
f[x][0]=max(f[x][0],f[q[i]][0]+s[q[0]]-f[q[i]][1]+v[x]);
f[x][1]=max(f[x][1],f[q[i]][0]+p[i-1]+v[x]+z+s[q[0]]-s[i]);
}
f[x][1]=max(f[x][1],f[x][0]);
}
void solve(int x)
{
db l=ans,r=1e9,m;
for(int i=1;i<=n;i++)
v[i]=(a[i]+x)%mod;
dfs(1,0,ans+eps);
if (max(f[1][0],f[1][1])<ans+eps)
return;
while (r-l>eps)
{
m=(l+r)/2.0;
dfs(1,0,m);
if (max(f[1][0],f[1][1])>=m)
l=m;
else
r=m;
}
ans=l;
}
int main()
{
int i,x,y,k,m;
scanf("%d%d",&n,&mod);
for (i=1;i<=n;i++)
{
scanf("%d",a+i);
a[i]%=mod;
m=max(m,a[i]);
}
for (i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
scanf("%d",&k);
for (i=1;i<=n;i++)
{
x=mod-a[i]-1;
if (x<=k&&!vis[x])
{
solve(x);
vis[x]=1;
}
}
if (mod-k-1>m)
solve(k);
printf("%.6lf",ans);
}
来源:zr