Pagini recente » Cod sursa (job #172909) | Cod sursa (job #2491512) | Cod sursa (job #2026900) | Cod sursa (job #2866291) | Cod sursa (job #845196)
Cod sursa(job #845196)
#include <fstream>
#include <vector>
#include <cstring>
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 ];
void DFS(int nod)
{
mark[ nod ] = true;
s1 += cn[nod];
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])
DFS(*it);
}
}
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);
DFS(i);
if (solc > sol)
sol = solc;
memset(mark,0,sizeof(mark));
mark[i] = true;
}
}
fout << sol << '\n';
return 0;
}