Pagini recente » Cod sursa (job #2662113) | Cod sursa (job #2666437) | Cod sursa (job #2662107) | Cod sursa (job #3128419) | Cod sursa (job #1669462)
#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;
}