Pagini recente » Cod sursa (job #2945752) | Cod sursa (job #865175) | Cod sursa (job #1639303) | Cod sursa (job #2625) | Cod sursa (job #1344032)
#include <iostream>
#include <stdio.h>
using namespace std;
const int N=16001;
int lst[N],urm[N],fiu[N],nr,vf[N],v[N],best[N],summax=-1;
int n;
bool ver[N];
inline void adauga(int x, int y){
nr++;
vf[nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
}
void citire(){
FILE *in;
in=fopen("asmax.in","r");
fscanf(in,"%d",&n);
for(int i=1;i<=n;i++) fscanf(in,"%d",&v[i]);
for(int i=1;i<n;i++){
int a,b;
fscanf(in,"%d%d",&a,&b);
adauga(a,b);
fiu[b]++;
}
}
inline int maxim(int x, int y){
if(x>y) return x;
return y;
}
int dfs(int x){
ver[x]=1;
best[x]=v[x];
int p,y;
p=lst[x];
while(p!=0){
y=vf[p];
if(ver[y]==0) dfs(y);
best[x]=maxim(best[x],best[y]+best[x]);
p=urm[p];
}
summax=maxim(summax,best[x]);
}
int cauttata(){
for(int i=1;i<=n;i++) if(fiu[i]==0) return i;
}
int main()
{
citire();
dfs(cauttata());
FILE *out;
out=fopen("asmax.out","w");
fprintf(out,"%d",summax);
return 0;
}