Cod sursa(job #1415599)

Utilizator andrei_r_97Radoi Andrei andrei_r_97 Data 5 aprilie 2015 15:14:42
Problema Asmax Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <stdlib.h>

#define MAX_NODURI 16000
#define VAL_MAX 1000
#define MAX(a,b) (((a) > (b)) ? (a) : (b))

typedef struct Graf {
  int nod;
  struct Graf* next;
} Graf;

Graf *G[MAX_NODURI];
int suma[MAX_NODURI], vizitat[MAX_NODURI], val[MAX_NODURI];
int maxim = -VAL_MAX;

void adauga(int a, int b) {
  Graf *p = malloc(sizeof(Graf));
  p -> nod  = b;
  p -> next = G[a];
  G[a] = p;
}

void citire(FILE *in, int n) {
  int i;
  for (i = 0; i < n; i++) {
    fscanf(in, "%d", &val[i]);
  }
  int a, b;
  for (i = 1; i <= n - 1; i++) {
    fscanf(in, "%d %d", &a, &b);
    adauga(a - 1, b - 1);
    adauga(b - 1, a - 1);
  }
}

void sumaDFS(int nod) {
  vizitat[nod] = 1;
  suma[nod] = val[nod];

  Graf *p;
  for (p = G[nod]; p != NULL; p = p -> next)
    if (!vizitat[p -> nod]) {
      sumaDFS(p -> nod);
      if (suma[p -> nod] > 0)
				suma[nod] += suma[p -> nod];
      
    }

  maxim = MAX(maxim, suma[nod]);
}

int main() {
  
  FILE *in  = fopen("asmax.in", "r");
  FILE *out = fopen("asmax.out", "w");

  int n;
  fscanf(in, "%d", &n);
	citire(in, n);

  sumaDFS(0);
  fprintf(out, "%d", maxim);

  fclose(in);
  fclose(out);
  
  return 0;
}