Pagini recente » Cod sursa (job #524505) | Cod sursa (job #429466) | Cod sursa (job #3167202) | Cod sursa (job #2231181) | Cod sursa (job #2551106)
#include <iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
ifstream in("asmax.in");
ofstream out("asmax.out");
int n;
bool viz[16001];
vector<int>graf[16001];
vector<int>cost;
int suma[100001];
int parcurgere(int nod){
if( viz[nod] )
return suma[nod];
viz[nod] = true;
int pret = cost[nod];
for(int i = 0; i < graf[nod].size(); ++i){
int vecin = graf[nod][i];
if(viz[vecin] == false){
int x = parcurgere(vecin);
if(x >= 0)
pret = pret + x;
}
}
suma[nod] = pret;
return pret;
}
int main()
{
///citirea costurilor, aflarea costului maxim si numarul de costuri pozitive
in>>n;
cost.push_back(0);
int nr_poz = 0, cost_max = -1001;
for(int i = 1; i<=n; ++i){
int c; in>>c;
cost.push_back(c);
if(c>=-1)
++nr_poz;
cost_max = max(cost_max, c);
}
/// citirea grafului neorientat
for(int i = 1; i<n; ++i){
int a, b; in>>a>>b;
graf[a].push_back(b);
graf[b].push_back(a);
}
if(nr_poz <=1){
out<<cost_max;
return 0;
}
int a = parcurgere(1);
int smax = -1001;
for(int i = 1; i <= n; ++i){
smax = max(smax, suma[i]);
}
out<<smax;
in.close();
out.close();
return 0;
}