Cod sursa(job #1669462)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 30 martie 2016 18:52:04
Problema Asmax Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I, Semestrul 2 Marime 1.89 kb
#include <cstdio>
#define nmax 16002
#include <queue>
#include <algorithm>
 
using namespace std;

/*
Asmax

Se considera un arbore (graf neorientat, conex si aciclic) cu N varfuri, in care fiecare varf i are asociata o valoarea intreaga Vi. Se defineste 
un subarbore al arborelui dat, ca fiind un subgraf conex nevid al acestuia (care poate coincide chiar cu arborele dat).
Cerinta

Se cere sa determinati un subarbore al unui arbore dat, pentru care suma valorilor asociate varfurilor continute in subarbore sa fie maxima.
Date de Intrare

Prima linie a fisierului de intrare asmax.in contine numarul intreg N, reprezentand numarul de varfuri ale arborelui. A doua linie a fisierului 
contine N valori intregi, reprezentand valorile asociate nodurilor. A i-a valoare din acest sir reprezinta valoarea asociata nodului i. Urmatoarele
N-1 linii contin cate doi intregi distincti a si b, separati printr-un spatiu, avand semnificatia ca exista muchie intre varful numerotat cu a si 
cel numerotat cu b.
Date de Iesire

In fisierul asmax.out veti afisa suma maxima a unui subarbore al arborelui dat.
Restrictii

    1 ≤ N ≤ 16.000
    -1000 ≤ Vi ≤ 1000
    Varfurile sunt numerotate cu numere distincte intre 1 si N

*/

int N,t[nmax],d[nmax],s[nmax],rez = 0;
queue <int> Q;
 
int main(){
   
  freopen("asmax.in","r",stdin);
  freopen("asmax.out","w",stdout);
   
  scanf("%d ",&N);
  int i,j,k;
  for(i = 1;i <= N;++i){
    scanf("%d ",&s[i]);
    rez = min(rez,s[i]);
  }
  for(i = 1;i < N;++i){
    scanf("%d %d ",&j,&k);
    if(t[k] == 0)t[k] = j;
    else t[j] = k;
    d[j]++;d[k]++;
  }
   
  for(i = 1;i <= N;++i){
    if(d[i] == 1)Q.push(i);
    if(t[i] == 0)d[i]++;
  }
 
  s[0] = 0;
  while(!Q.empty()){
    i = Q.front();
    Q.pop();
     
      s[t[i]] = max(s[t[i]],s[t[i]] + s[i]);
      d[t[i]]--;
      if(d[t[i]] == 1)Q.push(t[i]);
    
    rez = max(rez,s[i]);
  }
   
  printf("%d\n",rez);
 
  return 0;
}