Pagini recente » Cod sursa (job #1345120) | Cod sursa (job #2893333) | Cod sursa (job #2799282) | Cod sursa (job #3133848) | Cod sursa (job #1658768)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("asmax.in");
ofstream g("asmax.out");
const int N = 16001;
const int M = 2*N;
int n;
int vf[M],lst[N],urm[M],nr;//lista alok dinamic
int v[N];
int viz[N];
int scor[N];
void adauga(int x, int y){
//y in lista lui x
nr++;
vf[nr]= y;
urm[nr]=lst[x];
lst[x]=nr;
}
void dfs(int x){
viz[x]=1;
int p,y;
p=lst[x];
while(p!=0){
y=vf[p];
if(!viz[y]){
dfs(y);
if(scor[y] > 0)
scor[x] += scor[y];
}
p=urm[p];
}
if ( scor[x] < 0 )
scor[x] = v[x];
else scor[x] += v[x];
}
int main()
{
int x,y;
f>>n;
for(int i=1;i<=n;i++)
f>>v[i];
for(int i=1;i<n;i++){
f>>x>>y;
adauga(x,y);
adauga(y,x);
}
dfs(1);
int maxim=scor[1];
for(int i=1;i<=n;i++){
if(scor[i]>maxim)
maxim=scor[i];
}
g<<maxim;
return 0;
}