Pagini recente » Cod sursa (job #2959468) | Cod sursa (job #1933455) | Cod sursa (job #1677539) | Cod sursa (job #79220) | Cod sursa (job #2676163)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
#include <algorithm>
using namespace std;
const int N = 16005;
int n, mx = INT_MIN;
vector<int> graf[N];
int cost[N];
bool amfost[N];
queue<int> coada;
void calc(int nod) {
coada.push(nod);
while(coada.empty() == false) {
nod = coada.front();
coada.pop();
if(amfost[nod])
continue;
amfost[nod] = true;
int newcost = cost[nod];
for (int i = 0; i < (int)graf[nod].size(); ++i) {
int to = graf[nod][i];
if(amfost[to] == false) {
newcost = max(newcost + cost[to], newcost);
}
}
for (int i = 0; i < (int)graf[nod].size(); ++i) {
int to = graf[nod][i];
if(amfost[to] == false) {
coada.push(to);
cost[to] = max(newcost, cost[to]);
}
}
// cout << '\n';
}
}
int main() {
ifstream fin("asmax.in");
ofstream fout("asmax.out");
int n;
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> cost[i];
for (int i = 1; i < n; ++i) {
int a, b;
fin >> a >> b;
graf[a].push_back(b);
graf[b].push_back(a);
}
calc(1);
for (int i = 1; i <= n; ++i) {
// cout << cost[i] << '\n';
mx = max(cost[i], mx);
}
// cout << '\n';
fout << mx << '\n';
return 0;
}