Pagini recente » Cod sursa (job #2921901) | Cod sursa (job #2756390) | Cod sursa (job #23690) | Cod sursa (job #2781220) | Cod sursa (job #846496)
Cod sursa(job #846496)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
const char iname[] = "asmax.in";
const char oname[] = "asmax.out";
ifstream fin(iname);
ofstream fout(oname);
int N , M , i , j , x , y , comp_conexe , gasit , s1 , s2 , solc , sol , MN;
int nr, vec[16004], dad[16004];
int cost_nod[ 16004 ];
bool viz[ 16004 ];
vector < int > Q[ 16004 ];
stack < int > st;
int main()
{
fin >> N;
for (i = 1; i <= N; ++i)
fin >> cost_nod[i];
for (i = 1; i <= N-1; ++i)
fin >> x >> y , Q[x].push_back(y) , Q[y].push_back(x);
vector < int > :: iterator it;
viz[1] = 1;
st.push(1);
MN = 1 << 30;
solc = MN * (-1);
sol = MN * (-1);
for (int i = 1; i <= N; ++i) vec[i] = cost_nod[i];
while(!st.empty())
{
x = st.top();
gasit = 0;
while(!Q[x].empty())
{
if (!viz[Q[x].front()])
{
it = Q[x].begin();
dad[*it] = x;
++nr;
st.push(*it);
viz[*it] = 1;
Q[x].erase(Q[x].begin());
gasit = 1;
break;
}
else
Q[x].erase(Q[x].begin());
}
if (!gasit)
{
st.pop();
if (vec[x] > 0)
vec[dad[x]] += vec[x];
}
}
for (int i = 1; i <= N; ++i) if (solc < vec[i]) solc = vec[i];
fout << solc << '\n';
return 0;
}