#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstdio>
using namespace std;
int main(){
int n;
while (scanf("%d",&n)!=EOF){
multiset<int> st;
vector<int> strength(n + 1);
for (int i = 1; i <= n; i++){
int t;
scanf("%d",&t);
st.insert(t);
strength[i] = t;
}
vector<vector<int>> edge(n + 1, vector<int>());
for (int i = 1; i < n; i++){
int a, b;
scanf("%d %d",&a,&b);
edge[a].push_back(b);
edge[b].push_back(a);
}
int res = INT_MAX;
for (int i = 1; i <= n; i++){
int temp = strength[i];
auto pos = st.find(temp);
st.erase(pos);
for (int j = 0; j < edge[i].size(); j++){
int index = edge[i][j];
temp = max(temp, strength[index] + 1);
pos = st.find(strength[index]);
st.erase(pos);
}
if (!st.empty()){
auto it = st.end();
it--;
int t = *it + 2;
temp = max(temp, t);
}
res = min(res, temp);
st.insert(strength[i]);
for (int j = 0; j < edge[i].size(); j++){
int index = edge[i][j];
st.insert(strength[index]);
}
}
cout << res << endl;
}
return 0;
}
796C Bank Hacking
最新推荐文章于 2021-08-10 15:58:46 发布