Pagini recente » Cod sursa (job #2922659) | Cod sursa (job #2978247) | Cod sursa (job #1499998) | Borderou de evaluare (job #1036142) | Cod sursa (job #129114)
Cod sursa(job #129114)
#include <stdio.h>
#define N 16005
#define M 32005
int x[M], y[M], a[M], b[M];
int n, i, j, v[N], t[N], s[N], ps[N], pe[N], c[N], cs, cd;
void sort(int l, int r);
int main () {
freopen ("asmax.in", "r", stdin);
freopen ("asmax.out", "w", stdout);
scanf ("%d", &n);
v[0]=0; for (i=1;i<=n;i++) scanf ("%d", &v[i]);
for (i=0;i<2*(n-1);i+=2) { scanf ("%d%d", &x[i], &y[i]); x[i+1]=y[i]; y[i+1]=x[i]; }
x[2*(n-1)]=y[2*(n-1)]=n+1;
sort (0, 2*(n-1));
ps[0]=ps[1]=0; pe[0]=0;
for (i=1;x[i]<n;i++) if (x[i]!=x[i+1]) { pe[x[i]]=i; ps[x[i+1]]=i+1; }
pe[n]=i;
cs=cd=0;
c[0]=1;
t[0]=t[1]=1;
while (cs<=cd) {
for (i=ps[c[cs]];i<=pe[c[cs]];i++)
if (t[y[i]]==0) {
t[y[i]]=x[i];
cd++;
c[cd]=y[i]; }
cs++; }
for (i=n-1;i>0;i--) {
s[c[i]]+=v[c[i]];
if (s[c[i]]>0)
s[t[c[i]]]+=s[c[i]]; }
s[1]+=v[1];
cs=s[1];
for (i=2;i<=n;i++) if (cs<s[i]) cs=s[i];
printf ("%d\n", cs);
return 0;
}
void sort(int l, int r) {
int c, i, j, k;
if (l==r) return;
c=(l+r)/2;
sort(l, c);
sort(c+1, r);
i=l; j=c+1; k=l;
while (i<=c && j<=r)
if (x[i]<x[j]) {
b[k]=y[i];
a[k++]=x[i++]; }
else {
b[k]=y[j];
a[k++]=x[j++]; }
while (i<=c) { b[k]=y[i]; a[k++]=x[i++]; }
while (j<=r) { b[k]=y[j]; a[k++]=x[j++]; }
for (k=l; k<=r; k++) { x[k]=a[k]; y[k]=b[k]; } }