#include<bits/stdc++.h>
using namespace std;
const int N=888,inf=1000000000;
vector< pair<int,int> >tre[N];
int fa[N][66],mn[N],dp[N][N],val[N],d[N],cnt[N];
void dfs_1(int x)
{
for(int i=0;i<tre[x].size();i++)
{
int y=tre[x][i].first;
if(y==fa[x][0])continue;
fa[y][0]=x;
dfs_1(y);
}
return ;
}
void dfs_2(int x)
{
for(int i=0;i<tre[x].size();i++)
{
int y=tre[x][i].first;
if(y==fa[x][0])continue;
fa[y][0]=x;
dfs_2(y);
tre[x][i].second=cnt[y];
cnt[x]+=cnt[y];
}
return ;
}
int LCA(int x,int y)
{
if(d[x]<d[y])swap(x,y);
for(int i=32;i>=0;i--){
if(d[x]==d[y])break;
if(d[fa[x][i]]>=d[y])x=fa[x][i];
}
if(x==y)return x;
for(int i=32;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i],y=fa[y][i];
}
}
return fa[x][0];
}
void work(int x,int p,int n)
{
for(int i=0;i<tre[x].size();i++){
int y=tre[x][i].first;
if(y==fa[x][0])continue;
work(y,p,n);
}
for(int i=1;i<=n;i++){
if(val[i]<=val[x]&&val[x]<=val[i]+p){
for(int j=0;j<tre[x].size();j++){
int y=tre[x][j].first,z=tre[x][j].second;
if(y==fa[x][0])continue;
dp[x][i]=dp[x][i]+min(dp[y][i],mn[y]+z);
}
}
else dp[x][i]=inf;
}
mn[x]=inf;
for(int i=1;i<=n;i++)mn[x]=min(mn[x],dp[x][i]);
return ;
}
int main()
{
int n,m,k,x,y;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)scanf("%d",&val[i]);
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
tre[x].push_back(make_pair(y,0));
tre[y].push_back(make_pair(x,0));
}
dp[1]=1;
dfs_1(1);
for(int i=1;i<=32;i++){
for(int j=1;j<=n;j++){
fa[j][i]=fa[fa[j][i-1]][i-1];
}
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
cnt[x]++;
cnt[y]++;
cnt[LCA(x,y)]-=2;
}
dfs_2(1);
int l=0,r=1e9;
while(l<r){
memset(dp,0,sizeof(dp));
memset(mn,0,sizeof(mn));
int mid=(l+r)/2;
work(1,mid,n);
if(mn[1]>k)l=mid+1;
else r=mid;
}
printf("%d",l);
return 0;
}
评测记录