Pagini recente » Cod sursa (job #283291) | Cod sursa (job #2117972) | Cod sursa (job #2397681) | Cod sursa (job #614118) | Cod sursa (job #845195)
Cod sursa(job #845195)
#include <fstream>
#include <vector>
using namespace std;
const char iname[] = "asmax.in";
const char oname[] = "asmax.out";
ifstream fin(iname);
ofstream fout(oname);
int N , i , j , x , y , s1 , s2 , solc , sol;
int cn[ 16004 ];
vector < int > v[ 16004 ];
int MN = 1 << 30;
bool mark[ 16004 ];
int DFS(int nod)
{
int sum = 0;
mark[ nod ] = true;
if (MN > s2)
MN = s2;
//if (solc < s1 - MN)
// solc = s1 - MN;
s2 += cn[nod];
vector < int > :: iterator it;
for (it = v[nod].begin(); it != v[nod].end(); ++it)
{
if (!mark[*it])
{
int val = DFS(*it);
if (val > 0)
sum += val;
}
}
sum += cn[nod];
if (solc < sum) solc = sum;
return sum;
}
int main()
{
fin >> N;
for (i = 1; i <= N; ++i)
fin >> cn[i];
for (i = 1; i <= N-1; ++i)
{
fin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
}
sol = MN * (-1);
for (i = 1; i <= N; ++i)
{
if (!mark[i])
{
MN = 1 << 30;
solc = MN * (-1);
s1 = s2 = 0;
DFS(i);
if (solc > sol)
sol = solc;
}
}
fout << sol << '\n';
return 0;
}