AcWing 285. 没有上司的舞会
原题链接
简单
作者:
Snrise
,
2024-05-19 16:39:29
,
所有人可见
,
阅读 1
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#define int long long
#define endl '\n'
using namespace std;
const int N = 6010;
int h[N], e[N], ne[N], idx;
int w[N], fa[N];
int f[N][2];
int n, ans;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int u, int fa)
{
f[u][1] = w[u];
for (int i = h[u]; i != -1; i = ne[i])
{
int son = e[i];
if (son == fa)
{
continue;
}
dfs(son, u);
f[u][1] += f[son][0];
f[u][0] += max(f[son][1], f[son][0]);
}
}
signed main(void)
{
memset(h, -1, sizeof(h));
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
}
for (int i = 1; i <= n - 1; i++)
{
int f, s;
cin >> s >> f;
add(f, s);
fa[s] = f;
}
int root = 0;
for (int i = 1; i <= n; i++)
{
if (!fa[i])
{
root = i;
}
}
dfs(root, 0);
cout << max(f[root][0], f[root][1]) << endl;
return 0;
}