Cod sursa(job #1212199)

Utilizator vlad_DVlad Dumitriu vlad_D Data 24 iulie 2014 02:32:24
Problema Asmax Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;
int dp[16001][2];
int V[16001];
vector<int> G[16001];

// Solve for subtree (node, parent) given that the solution is_started.
int solve(int node, int parent, int is_started) {
  if (dp[node][is_started]) return dp[node][is_started] - 1;
  int ret = 0;
  int started = V[node];
  for (int i = 0; i < G[node].size(); ++i) {
    int node2 = G[node][i];
    if (node2 == parent) continue;
    if (!is_started) ret = max(ret, solve(node2, node, 0));
    started += solve(node2, node, 1);
  }
  ret = max(ret, started);
  dp[node][is_started] = ret + 1;
  return ret;
}
int N;
int main() {
  freopen("asmax.in", "r", stdin);
  freopen("asmax.out", "w", stdout);
  scanf("%d", &N);
  for (int i = 1; i <= N; ++i) scanf("%d", &V[i]);
  for (int i = 1; i < N; ++i) {
    int a, b; scanf("%d %d", &a, &b);
    G[a].push_back(b);
    G[b].push_back(a);
  }
  int ret = solve(1, -1, 0);
  if (ret == 0) {
    int best = -1000;
    for (int i = 1; i <= N; ++i) best = max(best, V[i]); 
    ret = best;
  }
  printf("%d\n", solve(1, -1, 0));
  return 0;
}