Pagini recente » Cod sursa (job #3159008) | Cod sursa (job #2379714) | Cod sursa (job #1035972) | Cod sursa (job #1752885) | Cod sursa (job #1584425)
#include <cstdio>
#define nmax 16002
#include <queue>
#include <algorithm>
using namespace std;
int N,t[nmax],d[nmax],s[nmax],rez = 0;
queue <int> Q;
queue <pair<int,int> > P;
int main(){
freopen("asmax.in","r",stdin);
freopen("asmax.out","w",stdout);
scanf("%d ",&N);
int i,j,k;
for(i = 1;i <= N;++i){
scanf("%d ",&s[i]);
rez = min(rez,s[i]);
}
for(i = 1;i < N;++i){
scanf("%d %d ",&j,&k);
P.push(make_pair(j,k));
d[j]++;d[k]++;
}
while(!P.empty()){
j = P.front().first;
k = P.front().second;
P.pop();
if(d[j] > d[k])t[k] = j;
else t[j] = k;
}
//for(i = 1;i <= N;i++)printf("%d %d\n",t[i],d[i]);
for(i = 1;i <= N;++i){
if(d[i] == 1){Q.push(i);d[i] = 0;}
if(t[i] == 0)d[i]++;
}
s[0] = 0;
while(!Q.empty()){
i = Q.front();
Q.pop();
s[t[i]] = max(s[t[i]],s[t[i]] + s[i]);
d[t[i]]--;
if(d[t[i]] == 1)Q.push(t[i]);
rez = max(rez,s[i]);
}
printf("%d\n",rez);
return 0;
}