Pagini recente » Cod sursa (job #1276723) | Cod sursa (job #3227954) | Cod sursa (job #1286270) | Cod sursa (job #2663456) | Cod sursa (job #1579758)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin ("asmax.in");
ofstream cout ("asmax.out");
vector <int> G[16005];
queue <int> q;
int cost[16005], n, sum, frn;
bool viz[16005], added;
void read()
{
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> cost[i];
}
for(int i = 1; i <= n; ++i)
{
int a, b;
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
}
void bfs(int node)
{
///sum of whole tree, not just 1 branch
viz[node] = true;
q.push(node);
while(q.empty() == false)
{
frn = q.front();
if(added == true)
{
sum += cost[frn];
}
if(sum < 0)
{
sum = 0;
}
if(cost[frn] > 0)
{
added = true;
sum += cost[frn];
}
q.pop();
for(auto it: G[frn])
{
if(viz[it] == false and cost[it] > 0)
{
q.push(it);
}
}
}
}
void solve()
{
for(int i = 1; i <= n; ++i)
{
if(G[i].size() == 1)
{
bfs(i);
}
}
}
void print()
{
if(added == false)
{
sum = cost[frn];
}
cout << sum << " ";
}
int main()
{
read();
solve();
print();
return 0;
}