Pagini recente » Cod sursa (job #2956463) | Cod sursa (job #2337406) | Cod sursa (job #2726547) | Cod sursa (job #1137973) | Cod sursa (job #1452943)
#include <stdio.h>
#include <list>
#include <climits>
/* Nume fisiere intrare/iesire */
#define FIN "asmax.in"
#define FOUT "asmax.out"
/* Numar maxim de intrari */
#define NMAX 16001
/* fisiere */
FILE *in, *out;
/* numarul de noduri */
int N;
/* arbore reprezentat prin liste de adiacenta */
std::list<int> graph[NMAX];
/* suma maxima */
long smax = LONG_MIN / 2;
/* valorile din noduri */
long values[NMAX];
/* vector de dinamica */
long dinamica[NMAX];
bool visited[NMAX];
int DFS(int node){
long sum = 0;
visited[node] = true;
sum += values[node];
for(std::list<int>::iterator it = graph[node].begin(); it != graph[node].end(); ++it){
int p = *it;
if ( !visited[p] ) {
sum += DFS(p);
}
}
if (sum > smax) smax = sum;
if (sum > 0) return sum;
return 0;
}
void solve(){
DFS(1);
}
int main(){
/* deschidere fisiere */
in = fopen(FIN, "rt");
out = fopen(FOUT, "wt");
if(!in || !out) return 1;
fscanf(in, "%d", &N);
for(int i=1; i <= N; i++) fscanf(in, "%li", &values[i]);
for(int i=1; i < N; i++){
int a,b;
fscanf(in, "%d%d", &a, &b);
graph[a].push_back(b);
graph[b].push_back(a);
}
solve();
fprintf(out, "%li", smax);
/* inchidere fisiere */
fclose(in);
fclose(out);
return 0;
}