#include<iostream>
#include<algorithm>
#include<string>
#include<unordered_map>
#include<set>
#include<vector>
#include<cmath>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;
ll read()
{
ll s=0, t=1; char ch=getchar();
for (; ch<'0'||ch>'9'; ch=getchar()) if (ch=='-') t=0;
for (; ch>='0'&&ch<='9'; ch=getchar()) s=s*10+ch-'0';
return t?s:-s;
}
const int N=5e3+5, M=1e4+5;
const ll inf=1e18;
int a[N]; ll f[N][2][N];
int he[N], ed[M], ne[M], tot, sz[N];
void add(int x, int y){ed[++tot]=y; ne[tot]=he[x]; he[x]=tot;}
void dfs(int rt, int fa) {
sz[rt]=1;
bool cur=0;
for (int i=he[rt]; i; i=ne[i]) if (ed[i]!=fa) {
dfs(ed[i], rt);
cur^=1;
for (int j=1; j<=sz[rt]+sz[ed[i]]; j++) f[rt][cur][j]=inf;
for (int j=1; j<=sz[rt]; j++)
for (int k=1; k<=sz[ed[i]]; k++)
f[rt][cur][j+k]=min(f[rt][cur^1][j]+f[ed[i]][0][k], f[rt][cur][j]);
sz[rt]+=sz[ed[i]];
}
if (cur) memcpy(f[rt][0], f[rt][1], sizeof(f[rt][0]));
for (int i=2; i<=sz[rt]; i++) f[rt][0][1]=min(f[rt][0][1], f[rt][0][i]+a[i-1]);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
#endif
int n=read(), x, y;
for (int i=1; i<n; i++) a[i]=read();
for (int i=1; i<n; i++) x=read(), y=read(), add(x, y), add(y, x);
dfs(1, 0);
printf("%lld", f[1][0][1]);
}
(不想看也可以给个AC代码方便对拍谢谢)