点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[4005],c[4005];
int n;
long long k;
int fa[4005],s[4005],h[4005];
bool b[4005];
void dfs(int n1)
{
if(n1!=1&&a[n1].size()==1)
{
h[n1]=1;
}
else
{
h[n1]=0;
}
s[n1]=b[n1];
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa[n1])
{
fa[a[n1][i]]=n1;
dfs(a[n1][i]);
s[n1]+=s[a[n1][i]];
h[n1]+=h[a[n1][i]];
}
}
}
long long f[4005][8005];
void dp(int n1)
{
for(int j=-h[n1];j<=s[n1];j++)
{
f[n1][j+h[n1]]=-1;
}
if(n1!=1&&a[n1].size()==1)
{
f[n1][-1+h[n1]]=0;
}
f[n1][h[n1]]=0;
if(b[n1])
{
f[n1][1+h[n1]]=0;
}
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa[n1])
{
int y=a[n1][i];
dp(y);
for(int j=-h[n1];j<=s[n1];j++)
{
f[0][j+h[n1]]=f[n1][j+h[n1]];
f[n1][j+h[n1]]=-1;
}
for(int l=-h[y];l<=s[y];l++)
{
if(f[y][l+h[y]]!=-1)
{
for(int j=-h[n1];j<=s[n1];j++)
{
if(j-l>=-h[n1]&&j-l<=s[n1]&&f[0][j-l+h[n1]]!=-1)
{
long long val=abs(l)*k+(l>-h[y])*c[n1][i]+f[0][j-l+h[n1]]+f[y][l+h[y]];
if(f[n1][j+h[n1]]==-1)
{
f[n1][j+h[n1]]=val;
}
else
{
f[n1][j+h[n1]]=min(f[n1][j+h[n1]],val);
}
}
}
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
a[i].clear();
c[i].clear();
int opt;
cin>>opt;
b[i]=opt;
fa[i]=0;
}
for(int i=1;i<n;i++)
{
int u,v,w;
cin>>u>>v>>w;
a[u].push_back(v);
a[v].push_back(u);
c[u].push_back(w);
c[v].push_back(w);
}
dfs(1);
dp(1);
cout<<2*f[1][h[1]]<<endl;
}
return 0;
}