Pagini recente » Cod sursa (job #3283062) | Cod sursa (job #2899237) | Cod sursa (job #1430477) | Cod sursa (job #1465212) | Cod sursa (job #1452925)
#include <stdio.h>
#include <list>
#include <climits>
/* Nume fisiere intrare/iesire */
#define FIN "asmax.in"
#define FOUT "asmax.out"
#define MIN(a,b) ((a<b)?(a):(b))
#define MAX(a,b) ((a>b)?(a):(b))
/* 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];
/* valorile din noduri */
long values[NMAX];
/* vector de dinamica */
long dinamica[NMAX];
bool invalid[NMAX];
void DFS(int node){
if(graph[node].empty()){
dinamica[node] = values[node];
return;
}
int sum = 0;
for(std::list<int>::iterator it = graph[node].begin(); it != graph[node].end(); ++it){
int neigh = *it;
DFS(neigh);
if(dinamica[neigh] + sum > dinamica[node]) sum += dinamica[neigh];
}
if(sum < 0) dinamica[node] = values[node];
else dinamica[node] = values[node] + sum;
}
long DFS_max(int node){
if(graph[node].empty()){
return dinamica[node];
}
int m = LONG_MIN;
for(std::list<int>::iterator it = graph[node].begin(); it != graph[node].end(); ++it){
int neigh = *it;
int v = DFS_max(neigh);
if(m < v) m = v;
}
return m;
}
void solve(){
for(int i=1; i < N; i++) dinamica[i] = LONG_MIN/2;
DFS(1);
for(int i=1; i <= N; i++){
printf("%li ", dinamica[i]);
}
//int result = DFS_max(1);
//dinamica[1] = result;
}
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);
int s = MIN(a,b);
int d = MAX(a,b);
graph[s].push_back(d);
}
solve();
fprintf(out, "%li", dinamica[1]);
/* inchidere fisiere */
fclose(in);
fclose(out);
return 0;
}