Pagini recente » Cod sursa (job #504593) | Cod sursa (job #1273084) | Cod sursa (job #1677415) | Cod sursa (job #3177972) | Cod sursa (job #2823603)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("asmax.in");
ofstream fout("asmax.out");
int n;
vector<vector<int>> muchii;
vector<int> costuri;
vector<int> viz;
int CalculeazaSuma(int nod, int& smax)
{
int suma=costuri[nod];
viz[nod]=1;
//iau vecinii pe rand si calculez recursiv pentru fiecare suma maxima pe care o poate obtine in subarborele in care el e radacina
for(auto vecin: muchii[nod])
if(!viz[vecin])
{
int val=CalculeazaSuma(vecin, smax);
if(suma+val>suma)// verific daca e profitabil sa adaug si suma maxima a vecinului la suma nodului curent
suma+=val;
}
if(suma>smax)
smax=suma;
return suma;
}
int SumaMaxima()
{
int smax=-1005;
//pastrez in parametrul smax maximul pe care-l intalnesc pe parcurs
CalculeazaSuma(1,smax); //consider 1 ca fiind radacina
return smax;
}
int main()
{
int a,b;
fin>>n;
muchii.resize(n+1);
costuri.resize(n+1);
viz.resize(n+1,0);
for(int i=1; i<=n; ++i)
fin>>costuri[i];
for(int i=0; i<n-1; ++i)
{
fin>>a>>b;
muchii[a].push_back(b);
muchii[b].push_back(a);
}
fout<<SumaMaxima();
return 0;
}