Pagini recente » Cod sursa (job #1160092) | Cod sursa (job #228077) | Cod sursa (job #2473852) | Cod sursa (job #1131129) | Cod sursa (job #201535)
Cod sursa(job #201535)
// http://infoarena.ro/problema/asmax
#include <cstdio>
#include <cstring>
#include <list>
using namespace std;
const int NMAX = 16001;
int n, m;
struct node {
int sum;
list<int> Neighb;
};
node All[NMAX];
void eraseEdge(int parent, int dead) {
list<int>::iterator li;
for (li = All[parent].Neighb.begin(); li != All[parent].Neighb.end(); ++ li)
if (*li == dead) {
All[parent].Neighb.erase(li);
break;
}
}
int main() {
freopen("asmax.in", "r", stdin);
freopen("asmax.out", "w", stdout);
scanf("%d", &n);
int i;
for (i = 0; i < n; ++ i)
scanf("%d", &All[i].sum);
int v1, v2;
for (i = 0; i < n - 1; ++ i) {
scanf("%d %d", &v1, &v2);
-- v1, -- v2;
All[v1].Neighb.push_back(v2);
All[v2].Neighb.push_back(v1);
}
m = n - 1;
int nL, ans = 0;
do {
nL = 0;
for (i = 0; i < n; ++ i)
if (All[i].Neighb.size() == 1) {
// printf("%d being erased\n", i + 1);
++ nL;
ans = max(ans, All[i].sum);
if (All[i].sum > 0) {
All[*(All[i].Neighb.begin())].sum += All[i].sum;
ans = max(ans, All[*(All[i].Neighb.begin())].sum);
}
eraseEdge(*(All[i].Neighb.begin()), i);
All[i].Neighb.clear();
}
} while (nL > 1);
printf("%d\n", ans);
return 0;
}